Spring Boot 外化配置及配置参数优先级
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
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接