springboot外部化配置

183 阅读2分钟

springboot允许使用外部化配置以便于在不同的环境中使用相同的代码。你可以使用多种外部配置源,包括properties文件、yaml文件、环境变量及命令行等。属性值可以通过在bean中定义@Value注解、通过Environment的getProperty方法或者定义一个@ConfigurationProperties标识的配置类来进行访问。

配置源优先级

配置信息在springboot中用PropertySource进行封装,spring Boot指定了多种配置源PropertySource的顺序,因此如果有同一个属性定义在不同的配置源时候需要考虑优先级问题(优先级高的配置会生效)。多种配置源优先级从高到低依次为:

  1. 当devtools处于激活状态时,$HOME/.config/spring-boot目录下的Devtools全局设置属性(可忽略)
  2. 单元测试时使用@TestPropertySource指定的配置源(可忽略)
  3. 单元测试时使用@SpringBootTest中的properties或value属性指定的配置源(可忽略)
  4. 命令行参数
  5. 环境变量或系统变量或命令行参数中指定的SPRING_APPLICATION_JSON或spring.application.json(json字符串)
  6. ServletConfig初始化参数
  7. ServletContext初始化参数
  8. java:comp/env 中的 JNDI 属性(可忽略)
  9. java系统变量(System.getProperties())
  10. 操作系统环境变量
  11. RandomValuePropertySource,它只有random.*属性
  12. 配置文件(如application.properties、application.yml等)
  13. 配置类上定义的@PropertySource指定的文件,这个属性源是在applicationContext refresh时才会被添加到环境中。这对于配置某些属性来说已经太晚了,比如 logging.* 和 spring.main.* ,它们在刷新开始前就已经被读取了。
  14. 默认属性(通过 SpringApplication.setDefaultProperties 指定)

配置文件优先级

优先级高的配置会生效,配置文件优先级从高到低依次为:

  1. 执行命令的目录下的config目录中子目录中的配置
  2. 执行命令的目录下的config目录的配置
  3. 执行命令的目录中的配置
  4. classpath下的config目录的配置
  5. classpath中的配置

指定profiles时,匹配顺序如下:

  1. 如果spring.profiles.active没有指定,按优先级找application.properties和application.yml(properties优先级高)
  2. 如果spring.profiles.active=dev,按优先级找application-dev.properties和application-dev.yml;没找到的话,再按优先级找application.properties和application.yml。
  3. 如果启动程序时通过-Dspring.config.location指定了配置文件路径,则程序运行时只读取指定的配置文件。指定配置文件不存在则报错,程序启动失败。