03_spring配置优先级
文章目录
- 一、配置优先级从高到低排序
- 1. 命令行参数(--key=value)
- 2. Java系统属性(-D参数)
- 3. 操作系统环境变量
- 4. 外部配置文件(JAR包外部)
- 5. JAR包内部配置文件
- 6. Profile-specific配置
- 7. @PropertySource注解
- 8. 默认属性
- 二、特殊场景说明
- 三、最佳实践建议
Spring Boot的配置和变量加载遵循明确的优先级规则,以下是综合多个来源的详细解析:
一、配置优先级从高到低排序
1. 命令行参数(–key=value)
通过--key=value
形式传递,直接覆盖其他配置(如java -jar app.jar --server.port=8081
)。
2. Java系统属性(-D参数)
通过JVM参数设置(如java -Dserver.port=8081 -jar app.jar
)。
3. 操作系统环境变量
通过系统变量设置(如export SERVER_PORT=8081
)。
4. 外部配置文件(JAR包外部)
- 目录优先级:
/config/
(JAR包同级) > 项目根目录 >classpath:/config/
>classpath:/
。 - 文件类型优先级:
.properties
>.yml
>.yaml
。
5. JAR包内部配置文件
位于src/main/resources
下的application.properties
或application.yml
。
6. Profile-specific配置
如application-{profile}.properties
,需通过spring.profiles.active
激活。
7. @PropertySource注解
显式加载的配置文件,优先级低于默认配置。
8. 默认属性
通过SpringApplication.setDefaultProperties()
设置。
二、特殊场景说明
- 微服务项目:
bootstrap.yml
优先级高于application.yml
,常用于Spring Cloud配置。 - 相同目录下的文件冲突:
.properties
会覆盖同名的.yml
文件。 - 随机值属性:如
random.*
,优先级低于环境变量但高于默认配置。
三、最佳实践建议
- 动态调整:生产环境推荐使用命令行参数或环境变量覆盖静态配置。
- 版本兼容性:Spring Boot 3.x以上版本严格遵循优先级规则,低版本可能存在差异。