当前位置: 首页 > 图灵资讯 > 技术篇> 【Spring Boot 初识丨外部化配置属性详解 】

【Spring Boot 初识丨外部化配置属性详解 】

来源:图灵教育
时间:2023-07-30 09:41:21

上一篇讲了 Spring Boot 本文介绍了Spring的依赖注入 Boot Spring外部化配置 Boot 初识:

(PropertySource)

加载顺序

  Spring Boot 使用一个非常特殊的PropertySource该顺序旨在允许合理的覆盖值。以下属性源可以覆盖上述定义的值。根据以下顺序考虑来源:

  1. 默认属性(由SpringApplication.setDefaultProperties指定)。
  2. @Configuration类上的@PropertySource注意。请注意,在刷新应用程序的上下文之前,此类属性源不会添加到环境中。配置某些属性已经太晚了,比如刷新开始前读取的标志.*和spring.main.*。
  3. 配置数据(例如application.properties文件)。
  4. RandomValuePropertySource 加载random.* 形式属性。
  5. 环境变量操作系统。
  6. Java 系统属性 ( System.getProperties())。
  7. 通过java:comp/env配置的 JNDI 属性
  8. ServletContext 初始化参数。
  9. ServletConfig 初始化参数。
  10. SPRING_APPLICATION_JSON(内联嵌入环境变量或系统属性 JSON)的属性。
  11. 命令行参数。
  12. 测试环境中的属性properties@SpringBootTest测试注解
  13. 测试中的@DynamicPropertySource注释。
  14. 在测试环境中 @TestPropertySource注解配置。
  15. Devtools 全局配置.$HOME/.config/spring-boot (当 devtools 被激活 ~/.spring-boot-devtools.properties)

按以下顺序考虑配置数据文件:

  1. jar 包外的 application-{profile}.propertiesapplication-{profile}.yml 配置
  2. jar 包内的 application-{profile}.propertiesapplication-{profile}.yml 配置
  3. jar 包外的 application.propertiesapplication.yml 配置
  4. jar 包内的 application.propertiesapplication.yml 配置
命令行属性

  默认情况下, SpringApplication 会获取--参数(例如 --server.port=9000 ),并将这个 property 添加到 Spring 的 Environment中。如前所述,命令行属性始终优先于基于文件的源属性。  如果不想加载命令行属性,可以通过 SpringApplication.setAddCommandLineProperties(false)禁用。

json应用程序属性

  环境变量和系统属性通常是有限的,这意味着某些属性名称不能使用。为了解决这个问题,Spring Boot 允许您将属性块编码到单个属性块 JSON 结构中。  当您的应用程序启动时,任何spring.application.jsonSPRING_APPLICATION_JSON所有属性都将被分析和添加Environment.例如,可以在 UN*X shell 提供命令行SPRING_APPLICATION_JSON属性作为环境变量:

$ SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar

在之前的例子中,您最终将进入Spring Environmentmy.name=test 。同样的, JSON属性也可以提供:

$ java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar

或者json 命令行参数:

$ java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'

如果要部署到经典的Application Server,您还可以使用名称java:comp/env/spring.application.json 的 JNDI 变量。