Spring Boot 配置加载顺序详解
在使用 Spring Boot 开发时,我们经常需要区分开发、测试和生产环境的配置。框架提供了灵活的机制来管理这些差异,但理解配置的加载顺序至关重要,否则很容易遇到'配置未生效'的困惑。
配置属性加载优先级
Spring Boot 内部有一套严格的属性源加载顺序。优先级高的配置会覆盖优先级低的配置。以下是详细的加载顺序列表(数字越小,优先级越高):
- Devtools 全局配置参数
- 单元测试上的
@TestPropertySource注解指定的参数 - 单元测试上的
@SpringBootTest注解指定的参数 - 命令行指定的参数,例如
java -jar app.jar --name="demo" - 命令行中的
SPRING_APPLICATION_JSON指定参数 ServletConfig初始化参数ServletContext初始化参数- JNDI 参数
- Java 系统参数(来源:
System.getProperties()) - 操作系统环境变量参数
RandomValuePropertySource随机数,仅匹配random.*- JAR 包外面的配置文件参数(
application-{profile}.properties/yaml) - JAR 包里面的配置文件参数(
application-{profile}.properties/yaml) - JAR 包外面的配置文件参数(
application.properties/yaml) - JAR 包里面的配置文件参数(
application.properties/yaml) @Configuration配置文件上@PropertySource注解加载的参数- 默认参数(通过
SpringApplication.setDefaultProperties指定)
实战验证
为了验证上述规则,我们可以编写一个简单的测试用例。重点观察 @SpringBootTest 注解与 application.properties 文件之间的优先级关系。
首先,在 application.properties 文件中定义一个属性:
name = app-from-file
接着,创建一个测试类,并在 @SpringBootTest 中指定该属性的值:
@SpringBootTest(value = {"name=app-from-test"})
public class ConfigOrderTest {
@Value("${name}")
private String name;
@Test
public void test() {
System.out.println("name is " + name);
}
}
运行测试后,控制台输出为 。这证实了 注解的优先级高于外部配置文件。

