Spring Boot 的配置加载顺序遵循优先级从高到低的原则,高优先级配置会覆盖低优先级配置,且不同来源的配置会进行合并。理解这个顺序对于排查“配置不生效”的问题至关重要。
核心优先级规则(从高到低)
1. 命令行参数(最高优先级)
通过 --key=value 形式传递,优先级最高。
java -jar myapp.jar --server.port=8081 --spring.profiles.active=prod
2. JNDI 属性
来自 java:comp/env 的 JNDI 属性。
3. Java 系统属性
通过 -D 参数设置。
java -Dserver.port=8081 -jar myapp.jar
4. 操作系统环境变量
如 SERVER_PORT=8081、SPRING_PROFILES_ACTIVE=prod。Spring Boot 支持宽松绑定(Relaxed Binding),环境变量名会自动映射为配置属性名。
5. 配置文件(application.properties / application.yml)
配置文件按以下位置顺序加载(优先级从高到低):
- 当前目录下的
/config子目录(推荐生产环境使用) - 当前目录(JAR 包同级目录)
- classpath 下的
/config包 - classpath 根路径
6. Profile 专用文件
application-{profile}.properties/yml 的优先级高于默认的 application.properties/yml。激活 Profile 后,Profile 专用文件中的同名属性会覆盖默认文件中的配置。
7. @PropertySource 注解
通过 @PropertySource 显式指定的配置文件。
8. 默认属性(最低优先级)
通过 SpringApplication.setDefaultProperties() 设置的默认属性。
配置文件位置优先级详解
| 优先级 | 位置(相对于 JAR 包运行目录) | 说明 |
|---|---|---|
| 最高 | ./config/ |
JAR 同级目录下的 config 文件夹,推荐生产环境使用 |
| 高 | ./ |
JAR 同级目录 |
| 低 | classpath:/config/ |
JAR 包内部 config 包(即 resources/config) |
| 最低 | classpath:/ |
JAR 包内部根路径(即 resources 根目录) |
实战技巧:将通用配置放在 JAR 包内部,将环境相关配置放在外部 ./config/ 目录中,实现代码可移植性与部署灵活性的平衡。
多环境配置加载机制
当激活特定 Profile(如 prod)时,加载顺序为:
- 加载
application.yml(公共配置) - 加载
application-prod.yml(Profile 专用配置,覆盖同名属性)
激活 Profile 的方式(优先级从高到低):
- 命令行参数:
--spring.profiles.active=prod - 系统环境变量:
SPRING_PROFILES_ACTIVE=prod - 配置文件:
spring.profiles.active=prod
微服务场景:bootstrap 配置文件
在 Spring Cloud 微服务架构中,引入 bootstrap.yml/properties 用于引导阶段的配置加载,优先级高于 application 配置文件:
bootstrap.yml → bootstrap.properties → application.yml → application.properties
bootstrap 配置文件主要用于从配置中心(如 Spring Cloud Config Server)拉取远程配置。
底层原理:PropertySource 机制
Spring Boot 将所有配置源封装为 PropertySource 对象,按优先级顺序存入 Environment 的 propertySourceList(CopyOnWriteArrayList)。当获取属性值时,从前往后遍历,找到第一个匹配的键即返回。这意味着列表中位置靠前的配置源优先级更高。
常见问题排查
Q1:配置属性不生效怎么办?
A:检查是否有更高优先级的配置源覆盖了该属性。使用 --debug 启动应用,查看 Environment 中所有生效的 PropertySource 列表。
Q2:外部配置文件未生效?
A:确认外部配置文件位于正确的目录(./config/ 或 ./),且文件名必须为 application.properties/yml。
Q3:多环境配置未加载?
A:确认 Profile 已正确激活,且 Profile 专用文件命名符合 application-{profile}.properties/yml 规范。
一句话总结
命令行参数 > 环境变量 > 外部配置文件 > 内部配置文件 > Profile 专用文件 > 默认属性。高优先级覆盖低优先级,不同来源的配置进行合并。
