24. Externalized Configuration

Spring Boot允许将配置外部化(externalize),这样你就能够在不同的环境下使用相同的代码。你可以使用properties文件,YAML文件,环境变量和命令行参数来外部化配置。

  1. 使用@Value注解,可以直接将属性值注入到beans中(需要注册PropertyResolver才可以在@Value中使用EL表达式);

  2. 属性值可以通过访问Spring的抽象化的Environment获取(Environment是个接口,使用@Autowired注入,就可以在某个bean中获得Environment具体的实例);

  3. 属性值可以通过@ConfigurationProperties绑定到结构化对象来访问。

Spring Boot设计了一个非常特别的PropertySource顺序,以允许对属性值进行合理的覆盖,属性会以如下的顺序进行设值(上面的会覆盖下面的,从上往下查找,如:命令行参数会覆盖Java系统属性(System.getProperties())):

  1. home目录下的devtools全局设置属性(~/.spring-boot-devtools.properties,如果devtools激活)。
  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. RandomValuePropertySource,只包含random.*中的属性。
  12. 没有打进jar包的Profile-specific应用属性(application-{profile}.properties和YAML变量)。
  13. 打进jar包中的Profile-specific应用属性(application-{profile}.properties和YAML变量)。
  14. 没有打进jar包的应用配置(application.properties和YAML变量)。
  15. 打进jar包中的应用配置(application.properties和YAML变量)。
  16. @Configuration类上的@PropertySource注解。
  17. 默认属性(使用SpringApplication.setDefaultProperties指定)

下面是具体的示例,假设你开发一个使用name属性的@Component

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

@Component
public class MyBean {
    @Value("${name}")
    private String name;
    // ...
}

你可以将一个application.properties放到应用的classpath下,为name提供一个合适的默认属性值。当在新的环境中运行时,可以在jar包外提供一个application.properties覆盖name属性。对于一次性的测试,你可以使用特定的命令行开关启动应用(比如,java -jar app.jar --name="Spring")。

SPRING_APPLICATION_JSON属性可以通过命令行的环境变量设置,例如,在一个UNIX shell中可以这样:

$ SPRING_APPLICATION_JSON='{"foo":{"bar":"spam"}}' java -jar myapp.jar

在上面这个例子中Spring的Environement里的foo.bar=spam,你也可以将这个JSON用spring.application.json设置在系统变量(System variable 指的一般是JVM参数)里

$ java -Dspring.application.json='{"foo":"bar"}' -jar myapp.jar

或者命令行参数里

$ java -jar myapp.jar --spring.application.json='{"foo":"bar"}'

或者JNDI变量里

java:comp/env/spring.application.json

results matching ""

    No results matching ""