Spring Boot 配置加载顺序及属性加载顺序详解
Spring Boot 是一个流行的 Java 框架,用于快速构建基于 Spring 的应用程序。在 Spring Boot 中,配置加载顺序及属性加载顺序是一个非常重要的概念。我们可以通过多种方式来加载配置,例如 properties 文件、YAML 文件、系统环境变量、命令行参数等等。在本章节中,我们将详细介绍 Spring Boot 配置加载顺序及属性加载顺序。
配置加载顺序
在 Spring Boot 中,配置加载顺序是指在应用程序启动时,Spring Boot 如何加载配置文件的顺序。这个顺序非常重要,因为它将决定哪些配置文件将被加载,哪些将被覆盖。下面是 Spring Boot 配置加载顺序:
1. 开发者工具 `Devtools` 全局配置参数
2. 单元测试上的 `@TestPropertySource` 注解指定的参数
3. 单元测试上的 `@SpringBootTest` 注解指定的参数
4. 命令行指定的参数,如 `java -jar springboot.jar --name="Java技术栈"`
5. 命令行中的 `SPRING_APPLICATION_JSONJSON` 指定参数, 如 `java -Dspring.application.json='{"name":"Java技术栈"}'-jar springboot.jar`
6. `ServletConfig` 初始化参数
7. `ServletContext` 初始化参数
8. JNDI参数(如 `java:comp/env/spring.application.json`)
9. Java系统参数(来源:`System.getProperties()`)
10. 操作系统环境变量参数
11. `RandomValuePropertySource` 随机数,仅匹配:`ramdom.*`
12. JAR包外面的配置文件参数(`application-{profile}.properties(YAML)`)
13. JAR包里面的配置文件参数(`application-{profile}.properties(YAML)`)
14. JAR包外面的配置文件参数(`application.properties(YAML)`)
15. JAR包里面的配置文件参数(`application.properties(YAML)`)
16. `@Configuration`配置文件上 `@PropertySource` 注解加载的参数
17. 默认参数(通过 `SpringApplication.setDefaultProperties` 指定)
在上面的列表中,数字小的优先级越高,即数字小的会覆盖数字大的参数值。
属性加载顺序
在 Spring Boot 中,属性加载顺序是指在应用程序启动时,Spring Boot 如何加载属性的顺序。这个顺序非常重要,因为它将决定哪些属性将被加载,哪些将被覆盖。下面是 Spring Boot 属性加载顺序:
1. 使用 `@Value` 注解直接注入对应的值
2. 使用 `@ConfigurationProperties` 注解把对应的值绑定到一个对象
3. 直接获取注入 Environment 进行获取
在 Spring Boot 中,我们可以使用多种方式来加载属性,例如使用 `@Value` 注解直接注入对应的值,使用 `@ConfigurationProperties` 注解把对应的值绑定到一个对象,直接获取注入 Environment 进行获取等等。
实践验证
为了验证 Spring Boot 配置加载顺序及属性加载顺序,我们可以进行实践验证。例如,我们可以在主应用程序中添加 Java 系统参数:
```java
@Bean
public CommandLineRunner commandLineRunner() {
return (args) -> {
System.setProperty("name", "javastack-system-properties");
};
}
```
然后,我们可以在 `application.properties` 文件中添加属性:
```properties
name = javastack-application
```
接着,我们可以在 `application-dev.properties` 文件中添加属性:
```properties
name = javastack-application-dev
```
我们可以添加测试类来验证配置加载顺序:
```java
@RunWith(SpringRunner.class)
@SpringBootTest(value = { "name=javastack-test", "sex=1" })
@ActiveProfiles("dev")
public class SpringBootBestPracticeApplicationTests {
@Value("${name}")
private String name;
@Test
public void testName() {
System.out.println(name);
}
}
```
通过实践验证,我们可以看到 Spring Boot 配置加载顺序及属性加载顺序的实际效果。