Skip to content

Latest commit

 

History

History
52 lines (39 loc) · 3.28 KB

File metadata and controls

52 lines (39 loc) · 3.28 KB

24. 外部化配置

Spring Boot允许您外部化配置,以便在不同的环境下使用相同的程序代码。您可以使用properties文件、YAML文件、环境变量以及命令行参数来外部化配置。通过Spring的Environment抽象访问或通过@ConfigurationProperties绑定到结构化对象,可以使用@Value注解将属性值直接注入到bean中。

Spring Boot使用一个非常特别的PropertySource加载顺序,旨在允许合理地覆盖属性值。属性按以下顺序:

  1. 在您主目录上的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的应用程序属性文件application-{profile}.properties和YAML变量)
  13. 打包的jar文件内的特定profile的应用程序属性文件application-{profile}.properties和YAML变量)
  14. 不在打包的jar文件内的应用程序属性(application-{profile}.properties和YAML变量)
  15. 打包的jar文件内的应用程序属性(application-{profile}.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;

    // ...

}

在您应用程序的类路径上(比如在您的jar中)可以有一个application.properties文件,它为name提供合理的默认属性值。在新环境中运行时,可以在jar文件以外提供一个application.properties用于覆盖name;对于一次性测试,您可以使用特定的命令行参数(比如java -jar app.jar --name="Spring")。

可以在命令行上使用环境变量提供SPRING_APPLICATION_JSON属性。例如在UN*X shell中: $ SPRING_APPLICATION_JSON='{"foo":{"bar":"spam"}}' java -jar myapp.jar 在此示例中,最终在SpringEnvironment中将是foo.bar=spam。您还可以在System变量中提供JSON作为spring.application.json: $ 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