常规 Spring 环境下,注入 properties 文件里的值的方式,通过 @PropertySouce 指明 properties 文件的位置,然后通过 @Value 注入值。在 Spring Boot 里,只需要在 application.properties 定义属性,直接使用 @Value 注入即可。
Spring Boot 支持两种格式的配置文件(.properties or .yml),两种格式的配置文件都可以通过 @Value 或者 @ConfigurationProperties 的方式注入到我们的项目中使用。
两种格式配置文件示例
application.properties
# 产品信息
system.product-name=Rabbit
system.copyright-year=2017
system.version=V1.0.0
application.yml
# 产品信息
system:
product-name: Rabbit
copyright-year: 2017
version: V1.0.0
配置文件注入
@Value 注入
@Value("${system.product-name}")
private String productName;
@ConfigurationProperties 注入
通过 @ConfigurationProperties 加载配置文件内的配置,通过 prefix 属性指定 yml 的配置的前缀。
配置类:
/**
* 产品信息
*
* @author yinjianwei
* @date 2017/12/07
*/
@Component
@ConfigurationProperties(prefix = "product")
public class ProductSettings {
private String name;
private String copyrightYear;
private String version;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCopyrightYear() {
return copyrightYear;
}
public void setCopyrightYear(String copyrightYear) {
this.copyrightYear = copyrightYear;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
通过 @Autowired 注入配置类:
@Autowired
private ProductSettings systemSettings;
配置文件的生效顺序
- @TestPropertySource 注解
- 命令行参数(java -jar demo.jar —server.port=9090)
- Java 系统属性(System.getProperties())
- 操作系统环境变量
- 只有在 random.* 里包含的属性会产生一个 RandomValuePropertySource
- 在打包的 Jar 外的应用程序配置文件(通过 spring.config.location 参数)
- 在打包的 Jar 内的应用程序配置文件
- 在 @Configuration 类上的 @PropertySource 注解
- 默认属性(使用 SpringApplication.setDefaultProperties 指定)
SpringApplication 类默认会把以“—”开头的命令行参数转化成应用中可以使用的配置参数,如 “—name=Alex” 会设置配置参数 “name” 的值为 “Alex”。如果不需要这个功能,可以通过 “SpringApplication.setAddCommandLineProperties(false)” 禁用解析命令行参数。
配置随机值
RandomValuePropertySource 可以用来生成各种不同类型的随机值,从而免去了在代码中生成的麻烦。RandomValuePropertySource 可以生成数字和字符串。数字的类型包含 int 和 long,可以限定数字的大小范围。以“random.”作为前缀的配置属性名称由 RandomValuePropertySource 来生成。
rabbit.secret=${random.value}
rabbit.number=${random.int}
rabbit.bignumber=${random.long}
rabbit.number.less.than.ten=${random.int(10)}
rabbit.number.in.range=${random.int[1024,65536]}
读取使用注解:@Value(value = “${rabbit.secret}”)
注意:出现黄点提示,是要提示配置元数据,可以不配置。
属性占位符
可以在配置文件中引用前面配置过的属性
rabbit.name=www.baidu.com
rabbit.desc=${rabbit.name} is a domain name
可以在属性占位符中配置一个默认值
rabbit.desc=${rabbit.name : www.baidu.com} is a domain name
如果没有 rabbit.name 配置项,则使用 www.baidu.com 作为值。
Application属性文件读取顺序
Spring Boot 配置文件默认可以放到以下目录中,可以自动读取到:
- 项目根目录下
- 项目根目录中 config 目录下
- 项目的 resources 目录下
- 项目 resources 目录中 config 目录下
读取顺序
如果在不同的目录中存在多个配置文件,它的读取顺序是:
- config/application.properties(项目根目录中 config 目录下)
- config/application.yml
- application.properties(项目根目录下)
- application.yml
- resources/config/application.properties(项目 resources 目录中 config 目录下)
- resources/config/application.yml
- resources/application.properties(项目的 resources 目录下)
- resources/application.yml
注意:
- 如果同一个目录下,有 application.yml 也有 application.properties,默认先读取 application.properties。
- 如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
- 创建 Spring Boot 项目时,一般的配置文件放置在“项目的 resources 目录下”。
加载 Jar 包外配置
java -jar demo.jar --spring.config.location=/path/application.properties