Spring Boot允许我们将配置外部化处理,以便可以使用相同的代码在不同的环境中运行。我们可以使用属性文件、YAML文件、环境变量和命令参数来进行外化配置。而这些配置中的属性可以通过@Value注解直接注入到对应的Bean中,可以通过Spring的Environment抽象访问,也可以通过@ConfigurationProperties绑定到结构化的对象上。
Spring Boot设计了非常特殊的加载指定属性文件(PropertySource)的顺序,以允许对属性值进行合理的覆盖。属性值会以下面的优先级进行设置:

  • home目录下的Devtools全局设置属性(~/.spring-boot-devtools.properties,当devtools激活时)。
  • @TestPropertySource注解的测试用例。
  • @SpringBootTest#properties注解的测试用例。
  • 命令行参数。
  • 来自SPRING_APPLICATION_JSON的属性(内嵌在环境变量或系统属性中的内联JSON)。
  • ServletConfig初始化参数。
  • ServletContext初始化参数。
  • java:comp/env的JNDI属性。
  • java系统属性(System.getProperties())。
  • 操作系统环境变量。
  • RandomValuePropertySource,只包含random.*中的属性。
  • jar包外的Profile-specific应用属性(application-{profile}.properties和YAML变量)。
  • jar包内的Profile-specific应用属性(application-{profile}.properties和YAML变量)。
  • jar包外的应用配置(application.properties和YAML变量)。
  • jar包内的应用配置(application.properties和YAML变量)。
  • @Configuration类上的@PropertySource注解。
  • 默认属性(通过SpringApplication.setDefaultProperties指定)。

具体示例如下,可以通过@Component将name属性注入到对应Bean中:

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

@Component
public class MyBean {

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

    // ...

}

在应用程序中,可以在应用程序的classpath下通过application.properties配置文件来配置name参数。当启动程序时,可以通过外置的application.properties配置文件中name属性来覆盖内部的name配置,也可以通过命令参数来进行覆盖。如:

java -jar app.jar --name=Spring


Spring Boot 外化配置及配置参数优先级插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2019/09/27/spring-boot-%e5%a4%96%e5%8c%96%e9%85%8d%e7%bd%ae%e5%8f%8a%e9%85%8d%e7%bd%ae%e5%8f%82%e6%95%b0%e4%bc%98%e5%85%88%e7%ba%a7/