spring boot 通过环境变量注入配置属性

概述

在使用 spring boot 的开发过程中,可通过 properties 属性文件、YAML 属性文件、环境变量以及命令行参数来注入配置,实现相同代码在不同环境的运行。在应用里引用属性时可以通过@Value注解来注入,也可以使用@ConfigurationProperties注解定义配置类来载入配置,后者的使用请参考《绑定配置属性至结构化对象》。
spring boot 的配置属性来源优先级顺序如下:

  1. 当 devtools 激活时,home 目录下的~/.spring-boot-devtools.propertiesDevtools 全局设置属性
  2. 测试中的@TestPropertySource 注解。
  3. 测试中的@SpringBootTest#properties 注解属性。
  4. 命令行参数
  5. 环境变量或系统属性中的SPRING_APPLICATION_JSON键对应的 json 对象。
  6. ServletConfig初始化参数。
  7. ServletContext初始化参数。
  8. 来自java:comp/env的 JNDI 属性。
  9. Java 系统属性 (System.getProperties())。
  10. 系统环境变量。
  11. random.*形式的RandomValuePropertySource
  12. spring boot 可执行 jar 包外的Profile-specific application properties(application-{profile}.properties 及 YAML 格式的配置文件 )。
  13. spring boot 可执行 jar 包内的Profile-specific application properties(application-{profile}.properties 及 YAML 格式的配置文件 ).
  14. spring boot 可执行 jar 包外的应用属性文件 (application.properties 及 YAML 格式的配置文件 )。
  15. spring boot 可执行 jar 包内的应用属性文件 (application.properties 及 YAML 格式的配置文件 )。
  16. @Configuration配置类上的@PropertySource 注解。
  17. 使用SpringApplication.setDefaultProperties定义的缺省配置属性。

下面是一个例子,假设编写一个@Component组件,该组件使用了名为name的配置属性:

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

在上面的例子中,你可以通过打到 jar 包类路径下的 application.properties 文件里的name属性来提供缺省值,当在不同环境中运行需要改变这个缺省值时,你可以通过在 jar 包外放置另一个 application.properties 文件来重写name属性,或者,你也可以选择在启动命令里添加启动参数来重写name属性,例如:java -jar app.jar --name="Spring"

随机值配置

spring boot 的RandomValuePropertySource特性对于需要注入随机值的场景非常有用。利用这个特性,能生成整型, 长整型, uuid 类型或字符串类型的随机值,举例如下:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

其中random.int*的语法形如OPEN value (,max) CLOSE,这里的OPEN,CLOSE可以是任意字符,而value,max必须是整数,如果填写了max,那么产生的随机数就大于等于value并且小于max