常规 Spring 环境下,注入 properties 文件里的值的方式,通过 @PropertySouce 指明 properties 文件的位置,然后通过 @Value 注入值。在 Spring Boot 里,只需要在 application.properties 定义属性,直接使用 @Value 注入即可。

Spring Boot 支持两种格式的配置文件(.properties or .yml),两种格式的配置文件都可以通过 @Value 或者 @ConfigurationProperties 的方式注入到我们的项目中使用。

两种格式配置文件示例

application.properties

  1. # 产品信息
  2. system.product-name=Rabbit
  3. system.copyright-year=2017
  4. system.version=V1.0.0

application.yml

  1. # 产品信息
  2. system:
  3. product-name: Rabbit
  4. copyright-year: 2017
  5. version: V1.0.0

配置文件注入

@Value 注入

  1. @Value("${system.product-name}")
  2. private String productName;

@ConfigurationProperties 注入
通过 @ConfigurationProperties 加载配置文件内的配置,通过 prefix 属性指定 yml 的配置的前缀。

配置类:

  1. /**
  2. * 产品信息
  3. *
  4. * @author yinjianwei
  5. * @date 2017/12/07
  6. */
  7. @Component
  8. @ConfigurationProperties(prefix = "product")
  9. public class ProductSettings {
  10. private String name;
  11. private String copyrightYear;
  12. private String version;
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getCopyrightYear() {
  20. return copyrightYear;
  21. }
  22. public void setCopyrightYear(String copyrightYear) {
  23. this.copyrightYear = copyrightYear;
  24. }
  25. public String getVersion() {
  26. return version;
  27. }
  28. public void setVersion(String version) {
  29. this.version = version;
  30. }
  31. }

通过 @Autowired 注入配置类:

  1. @Autowired
  2. private ProductSettings systemSettings;

配置文件的生效顺序

  1. @TestPropertySource 注解
  2. 命令行参数(java -jar demo.jar —server.port=9090)
  3. Java 系统属性(System.getProperties())
  4. 操作系统环境变量
  5. 只有在 random.* 里包含的属性会产生一个 RandomValuePropertySource
  6. 在打包的 Jar 外的应用程序配置文件(通过 spring.config.location 参数)
  7. 在打包的 Jar 内的应用程序配置文件
  8. 在 @Configuration 类上的 @PropertySource 注解
  9. 默认属性(使用 SpringApplication.setDefaultProperties 指定)

SpringApplication 类默认会把以“—”开头的命令行参数转化成应用中可以使用的配置参数,如 “—name=Alex” 会设置配置参数 “name” 的值为 “Alex”。如果不需要这个功能,可以通过 “SpringApplication.setAddCommandLineProperties(false)” 禁用解析命令行参数。

配置随机值

RandomValuePropertySource 可以用来生成各种不同类型的随机值,从而免去了在代码中生成的麻烦。RandomValuePropertySource 可以生成数字和字符串。数字的类型包含 int 和 long,可以限定数字的大小范围。以“random.”作为前缀的配置属性名称由 RandomValuePropertySource 来生成。

  1. rabbit.secret=${random.value}
  2. rabbit.number=${random.int}
  3. rabbit.bignumber=${random.long}
  4. rabbit.number.less.than.ten=${random.int(10)}
  5. rabbit.number.in.range=${random.int[1024,65536]}

读取使用注解:@Value(value = “${rabbit.secret}”)

注意:出现黄点提示,是要提示配置元数据,可以不配置。

属性占位符

可以在配置文件中引用前面配置过的属性

  1. rabbit.name=www.baidu.com
  2. rabbit.desc=${rabbit.name} is a domain name

可以在属性占位符中配置一个默认值

  1. rabbit.desc=${rabbit.name : www.baidu.com} is a domain name

如果没有 rabbit.name 配置项,则使用 www.baidu.com 作为值。

Application属性文件读取顺序

Spring Boot 配置文件默认可以放到以下目录中,可以自动读取到:

  • 项目根目录下
  • 项目根目录中 config 目录下
  • 项目的 resources 目录下
  • 项目 resources 目录中 config 目录下

image.png

读取顺序

如果在不同的目录中存在多个配置文件,它的读取顺序是:

  1. config/application.properties(项目根目录中 config 目录下)
  2. config/application.yml
  3. application.properties(项目根目录下)
  4. application.yml
  5. resources/config/application.properties(项目 resources 目录中 config 目录下)
  6. resources/config/application.yml
  7. resources/application.properties(项目的 resources 目录下)
  8. resources/application.yml

注意:

  1. 如果同一个目录下,有 application.yml 也有 application.properties,默认先读取 application.properties。
  2. 如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
  3. 创建 Spring Boot 项目时,一般的配置文件放置在“项目的 resources 目录下”。

加载 Jar 包外配置

  1. java -jar demo.jar --spring.config.location=/path/application.properties