一、YAML文件的不足
YAML文件的优势可以说一目了然,目前YAML的不足,例如无法通过@PropertySource
注解来加载配置。但是,YAML加载属性到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义时,YAML的配置方式比起properties配置文件更有优势。
二、自定义参数
自定义的参数可以在应用中使用@Value来获取。
@Value注解支持两种表达式配置
- PlaceHolder方式,格式为
${...}
,大括号内为PlaceHolder - SpEL表达式(Spring Expression Language), 格式为
#{...}
,大括号内为SpEL表达式
book.name=SpringCloudInAction
book.author=ZhaiYongchao
@Component
public class Book {
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
// 省略getter和setter
}
三、参数引用
在配置文件中可以使用${...}的方式来引用其他参数。
疑问:有没有先后顺序之分?
book.name=SpringCloud
book.author=ZhaiYongchao
book.desc=${book.author} is writing《${book.name}》
四、随机数
可以使用${random}来生成随机数。比如:秘钥,程序端口等。
# 随机字符串
com.lifeisftc.blog.value=${random.value}
# 随机int
com.lifeisftc.blog.number=${random.int}
# 随机long
com.lifeisftc.blog.bignumber=${random.long}
# 10以内的随机数
com.lifeisftc.blog.test1=${random.int(10)}
# 10-20的随机数
com.lifeisftc.blog.test2=${random.int[10,20]}
五、命令行参数
java -jar xxx.jar --server.port=8888
可以直接以命令行的方式来设置某些属性。
六、多环境配置
属性名:spring.profiles.active
多环境的配置思路:
application.properties
中配置通用内容,并设置spring.profiles.active=dev
,以开发环境为默认配置application-{profile}.properties
中配置各个环境不同的内容- 通过命令行方式去激活不同环境的配置
七、Spring Boot对数据文件的加载顺序(优先级由高到低)
Spring Boot为了能够更合理的重写各属性的值,使用了下面这种较为特别的属性加载顺序:
- 命令行中传入的参数;
SPRING_APPLICATION_JSON
中的属性。SPRING_APPLICATION_JSON
是以JSON格式配置在系统环境变量中的内容;java:comp/env
中的JNDI
属性;- Java的系统属性,可以通过
System.getProperties()
获得的内容; - 操作系统的环境变量;
- 通过
random.*
配置的随机属性; - 位于当前应用jar包之外,针对不同
{profile}
环境的配置文件内容,例如:application-{profile}.properties
或是YAML
定义的配置文件; - 位于当前应用jar包之内,针对不同
{profile}
环境的配置文件内容,例如:application-{profile}.properties
或是YAML
定义的配置文件; - 位于当前应用jar包之外的
application.properties
和YAML
配置内容; - 位于当前应用jar包之内的
application.properties
和YAML
配置内容; - 在
@Configuration
注解修改的类中,通过@PropertySource
注解定义的属性; - 应用默认属性,使用
SpringApplication.setDefaultProperties
定义的内容;
我们可以感受到这个优先级顺序的用意是Spring Boot想要将多环境配置逐渐转移到由外部操作来控制,而不是改程序文件或者代码。
八、配置文件绑定
1.下面的4种配置方式都是等价的(移除特殊字符,还会将配置均以全小写的方式进行匹配和加载):
推荐使用全小写配合-
分隔符的方式来配置,比如:spring.jpa.database-platform=mysql
spring.jpa.databaseplatform=mysql
spring.jpa.database-platform=mysql
spring.jpa.databasePlatform=mysql
spring.JPA.database_platform=mysql
2.List类型
在properties文件中使用[]或者逗号
来定位列表类型,[]中的值必须是连续的,
不然会抛出UnboundConfigurationPropertiesException
异常。
// 1.[]方式
spring.my-example.url[0]=http://example.com
spring.my-example.url[1]=http://spring.io
//2.逗号方式
spring.my-example.url=http://example.com,http://spring.io
在YML文件中的配置方式
// 1.第一种方式
spring:
my-example:
url:
- http://example.com
- http://spring.io
// 2.逗号方式
spring:
my-example:
url: http://example.com, http://spring.io
3.Map类型
// 1.properties格式
spring.my-example.foo=bar
spring.my-example.hello=world
// 2.YML格式
spring:
my-example:
foo: bar
hello: world
// 特殊的,如果Map类型的key包含非字母数字和-的字符,需要用[]括起来,比如,代表这是一个整体
spring:
my-example:
'[foo.baz]': bar