优先级从高到低排列,高优先级覆盖低优先级的同名属性。
一、运行时参数(最高)
1. 命令行参数
java -jar app.jar --server.port=9090
2. JVM 系统属性
java -Dserver.port=9090 -jar app.jar
3. OS 环境变量
export SERVER_PORT=9090
二、外部配置文件(JAR 包外部)
按目录优先级从高到低:
./config/子目录/application-{profile}.yml
./config/子目录/application.yml
./config/application-{profile}.yml
./config/application.yml
./application-{profile}.yml
./application.yml
三、内部配置文件(JAR 包内部)
1. 项目自身的 src/main/resources/(即 classes/)
classpath:/config/application-{profile}.yml
classpath:/config/application.yml
classpath:/application-{profile}.yml
classpath:/application.yml
2. Maven 依赖 JAR 包中的同名文件
同名文件被项目自身的覆盖,多个依赖 JAR 之间顺序不可控。
四、代码级配置(最低)
1. @PropertySource 注解
@PropertySource("classpath:custom.properties")
2. SpringApplication.setDefaultProperties()
SpringApplication.setDefaultProperties(Map.of("server.port", "8080"));
五、同一层级内的子规则
| 规则 | 高优先级 | 低优先级 |
|---|---|---|
| Profile | application-{profile}.yml |
application.yml |
| 目录 | config/ 子目录 |
根目录 |
| 位置 | JAR 外部 | JAR 内部 |
| classpath | 项目自身 classes/ |
依赖 JAR 包 |
| 格式 | .properties 和 .yml 同级,后加载覆盖前者 |
六、Spring Cloud Bootstrap 阶段(如适用)
bootstrap-{profile}.yml > bootstrap.yml
- Bootstrap 阶段在 application 阶段之前执行
- bootstrap 中的属性会放入高优先级
PropertySource,一般不会被application.yml覆盖 - bootstrap 文件之间的优先级规则与 application 一致(外部 > 内部、profile > 通用、项目 > 依赖 JAR)
速记口诀
命令行 → JVM → 环境变量 → JAR外文件 → JAR内文件 → 注解 → 默认值
每一层内部:profile专属 > 通用,config/ > 根目录,项目自身 > 依赖JAR
排查手段
启动时加 --debug,或访问 Actuator 端点:
GET /actuator/env/{property.name}
可以看到每个属性在所有 PropertySource 中的值及最终生效来源。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接
文章评论