Spring Boot 核心配置文件

1、SpringBoot 的核心配置文件有两个:bootstrap (.yml 或者 .properties),application (.yml 或者 .properties)。

2、Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文。两个上下文共用一个环境,它是任何 Spring 应用程序的外部属性的来源。

3、boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载,都可以用来配置参数。

4、bootstrap 优于 application 加载;bootstrap 偏向系统层级的参数配置,Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。application 偏向应用层级的参数配置。

4、使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
         a、一些固定的不能被覆盖的属性
         b、一些加密/解密的场景;

Spring Boot YAML 语法规范

1、Spring Boot 使用一个全局配置文件来对一些默认配置值进行修改,比如 Tomcat 端口等

2、配置文件名字约定为 “application.properties” 或者 “application.yml”

3、配置文件放必须放在 src/main/resources 目录或者类路径 /config 下

4、yml 全称 YAML(YAML Ain't Markup Language),以数据为中心,比 json、xml 等更适合做配置文件

5、语法规范参考网址:http://www.yaml.org

6、使用 # 符合进行内容注释。 

YAML 语法

1、k:(空格)v:表示一对键值对,注意必须有空格,如 info: good

2、使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格,具体个数没有强制限制,只要相同层级的元素左侧对齐即可(通常约定使用两个2个空格)

3、大小写敏感,如:

server:
  port: 8082
YAML 支持以下数据结构
数据类型描述举例
对象键值对的集合,常用写法

k: v:在下一行来写对象的属性和值的关系;注意缩进.冒号后面跟空格来分开键值;如下 frined 表示对象,latName  与 age 表示属性:

friend:
  lastName: zhangsan
  age: 20

{k: v}:行内写法,如下 frined 表示对象,latName 与 age表示属性

friend: {lastName: zhangsan,age: 18}

List一组按次序排列的值

“- 值”表示数组中的一个元素,注意缩进 和空格,如:

Animal:
 ‐ cat
 ‐ dog

行内写法:Animal: [cat,dog,pig]

数组用逗号分隔a,b,c,d,e,如:user.arr=ab,c,d,e
字面量单个的、不可再分的值

k: v:字面量直接写,值(v)可以是“数字”、“字符串”、“布尔”、“日期”

字符串默认不使用单引号或者双引号

双引号不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思,,如:name: "zhangsan \n lisi":输出的结果是:zhangsan 换行 lisi

单引号会转义字符串中的特殊字符,特殊字符最终只是一个普通的字符串数据,如:name: ‘zhangsan \n lisi’:输出结果为:zhangsan \n lisi

复合结构以上三种写法的任意组合都可以

使用示例:https://wangmaoxiong.blog.csdn.net/article/details/80998758。 


配置文件位置与加载顺序

1、Spring boot 启动时自动扫描以下位置的 application.properties 或者 application.yml 文件作为 Spring boot 的默认配置文件。

–file:./config/    -------------整个项目根目录下的config目录下

–file:./    ---------------------整个项目根目录下

–classpath:/config/---------类路径下的config目录下

–classpath:/-----------------类路径根目录下

2、优先级从上往下由高到底,高优先级的配置会覆盖低优先级的配置;Spring Boot 会从这四个位置加载所有的主配置文件,如果高优先级的内容与低优先级的内容相同,则覆盖;如果低优先级的内容在高优先级中没有,则形成互补。

3、应用启动后,1 位置的端口会生效,控制台会输出:Tomcat started on port(s): 8081 (http) with context path '/coco'

4、项目打包之后,与 jar 同目录下的位置相当于位置2,与 jar 同目录下的 config 子目录相当于位置 1.

外部配置加载位置与顺序

1、Spring Boot 支持多种外部配置方式,如下所示,从上往下加载优先级由高到低,内容相同时覆盖,不相同时累加。

1、命令行参数
2、来自 java:comp/env 的 JNDI 属性
3、使用“spring.config.location”改变默认的配置文件位置
4、Java 系统属性(System.getProperties())
5、操作系统环境变量
6、RandomValuePropertySource 配置的 random.* 属性值
7、jar 包外部的 application-{profile}.properties 或 application.yml (带spring.profile) 配置文件
8、jar 包内部的 application-{profile}.properties 或 application.yml (带spring.profile) 配置文件
9、jar 包外部的 application.properties 或 application.yml (不带spring.profile) 配置文件
10、jar 包内部的 application.properties 或 application.yml (不带spring.profile) 配置文件
11、@Configuration注解类上的@PropertySource
12、通过SpringApplication.setDefaultProperties指定的默认属性

2、官方文档:Externalized Configuration

命令行参数

1、命令行参数格式:java -jar xxxxx.jar --server.port=8082

2、多个参数时,用空格隔开,如: java -jar xxxxx.jar --server.port=8082 --server.servlet./context-path=/coco

3、修改端口同时指定上下文路径,命令行参数优先级高于 jar 文件内部的配置文件参数。

spring.config.location

1、通过 --spring.config.location 可以新的配置文件位置,自定义的外部配置文件优先级高于Jar文件内部的配置文件。

2、项目打包好以后,使用命令行参数的形式,启动项目的时候来指定配置文件的新位置:

1、新指定的配置文件和默认加载的这些配置文件共同起作用形成互补配置;
2、格式:java -jar spring-boot-xxx.jar --spring.config.location=G:/application.properties
3、spring-boot-xxx.jar 是打包好的应用文件、G:/application.properties是新的配置文件路径

3、当 application.properties 或 application.yml 文件在 xxx.jar 应用同目录下时,可以省略 --spring.config.location,直接双击运行,它会自动读取当前目录下的配置 application.properties 或 application.yml 文件。

配置文件 ${xxx} 占位符

1、Spring Boot 全局配置文件“application.yml”与"application.properties" 可以使用 ${random} 来设置随机值.

2、${xxx}也可以引用其他配置项的值.

3、如下所示配置参数:

# ${random} 中的 random 是一个内置的用于生成随机数的对象
author:
  addr: 深圳_${random.value} #随机生成一个32位的字符串,如:b21d56d2f10d74f84608dfff01b25552
  age: ${random.long} #随机生成一个long范围的随机数,如:2404587442488649534
  city: 长沙_${random.int(10)} #随机生一个[0,10]之间的随机数,如:8
  id: ${random.int}  #-随机生成一个int范围的随机数,如:-386223791
  like: 电影_${random.int[1024,65536]} #-随机生成一个[1024,65536]之间的随机数,如:63856
  userName: 张三_${random.uuid} #生成一个随机UUID值
  #获取配置文件中已经配置好的属性值,
  #如果属性不存在又没有设置默认值,某些方式直接返回整个“${author.userName}”字符串, environment.getProperty 方式取值时则直接解析报错.
  color: 红色_${author.userName}
  height: ${user.width:hello}_身高 #取user.width的值,没有时,使用默认值hello
  port: ${server.port:80}  #取服务端口号,默认值为80

src/main/resources/application.yml · 汪少棠/java-se - Gitee.com 

4、然后可以使用 @ConfigurationProperties 、@Value 注解等方式取值, 生成的值类似如下:

{
  "author.addr": "深圳_fdd47202334ee45378827a319bb4c750",
  "author.age": "2046606905162142912",
  "author.city": "长沙_6",
  "author.id": "1027745209",
  "author.like": "电影_16761",
  "author.userName": "张三_62c9d3ab-511b-446a-b1f3-3b41eb378060",
  "author.color": "红色_张三_44b5f81b-2666-4f59-a617-50b94f17cad6",
  "author.height": "hello_身高",
  "author.port": "8080"
}

src/main/java/org/example/controller/ValueController.java · 汪少棠/java-se - Gitee.com 

Spring Boot 多环境配置

1、Profile 是 Spring 对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

2、项目开发时有开发环境、测试环境、部署环境等,可以通过 profile 配置切换

3、spring.profiles.active 的值为多个时,用逗号隔开,官网文档

方式1:多 profile 文件形式

1、格式:application-{profile}.properties/yml,如:application-dev.properties、application-prod.properties 等

2、Spring Boot 默认从全局配置文件 application.properties 和 application.yml 进入开始读取

3、然后在全局配置文件 application.properties 和 application.yml 激活使用 “spring.profiles.active=profile”  激活指定文件.

方式2: yml 文档块形式

1、yml 文件支持多文档块方式,同一个 yml 文件中,可以使用"---"来区分不同的文档,相当于不同的配置文件

2、这也是 Spring Boot 官方推荐的方式

spring:
 profiles:
  active: devel #指定激活哪个环境配置,激活后,第一个文档内容失效;不指定时,以第一个文档为准
server:
 port: 8083
--- #"---"用于分隔不同的profiles()文档块
spring:
 profiles: devel #指定环境标识为"devel",相当于"application-{profile}.properties/yml"中的profile
server:
 port: 8081
---
spring:
 profiles: deploy #指定环境标识为"deploy",相当于"application-{profile}.properties/yml"中的profile
server:
 port: 8082

EnvironmentAware 读取 yml 配置

Spring Boot yml 文件读取:@ConfigurationProperties 、@EnableConfigurationProperties、@Value、Environment_蚩尤后裔的博客-CSDN博客

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐