JAVA后端开发—— Spring Boot 配置优先级解析(命令行 / JVM / 环境变量 / application.yml 谁覆盖谁?)
·
一、为什么会有优先级问题?
在实际开发中,同一个配置可能会出现在多个地方:
server.port=8080
它可能出现在:
- 命令行
- JVM 参数
- Docker environment
- application.yml
- 默认值
那问题来了:
Spring 最终到底用哪个?优先级是怎么样的?
二、Spring Boot 配置优先级总览(高 → 低)
下面是工程实践中最重要、最常见的优先级顺序:
1️⃣ 命令行参数(--xxx=yyy)
2️⃣ JVM 系统属性(-Dxxx=yyy)
3️⃣ 操作系统环境变量
4️⃣ 外部 application.yml(jar 同级目录)
5️⃣ 内部 application.yml(classpath 下)
6️⃣ @PropertySource
7️⃣ 默认值 ${xxx:default}
离“启动命令”越近,谁优先级越高。
三、逐层详细解析
① 命令行参数(最高)
java -jar app.jar --server.port=9090
特点:
- 最高优先级
- 专门为 Spring Boot 设计
- 适合部署时动态覆盖
使用场景:
- 线上临时改端口
- 指定 profile
--spring.profiles.active=prod
② JVM 系统属性(-D)
java -Dserver.port=9090 -jar app.jar
或者在 IntelliJ IDEA VM Options 里写:
-Dspring.profiles.active=dev
特点:
- 优先级仅次于 – 参数
- 本质是 System.getProperty()
适合:
- 本地开发
- IDE 调试
③ 操作系统环境变量
Linux / Mac:
export SERVER_PORT=9090
Docker:
environment:
SERVER_PORT: 9090
特点:
- 常用于容器化部署
- 优先级低于 -D
Spring 会自动把:
SERVER_PORT
映射为:
server.port
④ 外部 application.yml
例如:
/app.jar
/application.yml
如果 jar 同级目录有配置文件:
👉 优先级高于 jar 内部配置
这是生产环境最常用方式。
⑤ 内部 application.yml(classpath)
src/main/resources/application.yml
这是最常见的默认配置来源。
优先级低于:
- 命令行
- -D
- 环境变量
- 外部配置文件
⑥ @PropertySource
@PropertySource("classpath:xxx.properties")
特点:
- 通常用于传统 Spring 项目
- 优先级低于 application.yml
- 在 Boot 项目中不常作为主配置
⑦ 默认值(最低)
jdbc.url=${MYSQL_HOST:localhost}
意思:
如果前面所有来源都没有 MYSQL_HOST
就使用:
localhost
它永远是最后兜底。
四、特殊说明:RandomValuePropertySource
my.secret=${random.uuid}
这是 Spring Boot 内置的:
RandomValuePropertySource
不是配置的来源,而是框架自动注册。
它用于:
- 生成随机值
- 测试场景
- 动态端口
五、优先级对比实战示例
假设:
application.yml:
server:
port: 8080
Docker:
environment:
SERVER_PORT: 9090
IDEA VM Options:
-Dserver.port=7070
启动命令:
java -jar app.jar --server.port=6060
最终端口是多少?
答案:
6060
因为:
--参数 > -D > 环境变量 > yml
六、Spring Boot 配置加载核心原理
启动时:
- 创建 Environment
- 构建多个 PropertySource
- 按顺序插入
- 查找时从上往下找
- 找到即停止
本质是:
一个有序的 PropertySource 链表
七、适用于什么项目?
以上规则适用于:
- 基于 Spring Boot 的项目
如果是传统:
- XML + web.xml
- 非 Boot 项目
优先级规则会不同。
更多推荐

所有评论(0)