SpringBoot加载配置时的优先级
SpringBoot 加载配置时的优先级
Spring Boot 加载配置时的优先级如下(从高到低):
- 命令行参数(
--server.port=8081) - Java 系统属性(
-Dserver.port=8081) - 环境变量
- application.properties / yaml
- Profile 配置文件
- Nacos 配置中心(远程配置)
- 默认值
命令行参数(Application Arguments)、VM 参数(JVM Options)系统属性参数(-D)三者区别
🚀 一张表看懂三者区别
| 类型 | 示例 | 加在哪 | Spring Boot 是否能读取 | 优先级 |
|---|---|---|---|---|
| 命令行参数 | --server.port=8081 | JVM 启动命令的最后 | ✔ 是(最高优先) | ⭐⭐⭐⭐⭐ |
| 系统属性(VM 参数之一) | -Dserver.port=8081 | JVM 启动命令中 java 后 | ✔ 是 | ⭐⭐⭐⭐ |
| VM 参数(JVM Options) | -Xmx512m -XX:+PrintGC | JVM 调优参数 | ✘ 否 | ⭐⭐ |
🧩 1. 命令行参数(Application Arguments)
写法:
java -jar app.jar --server.port=9000
特点:
✔ Spring Boot 配置优先级最高
✔ 必须以 -- 开头
✔ 不属于 JVM,只是传给 Spring Boot 的应用参数
Spring 读取方式:
args[0] // 或 @Value / Environment
🧩 2. 系统属性(System Properties,属于 VM 参数)
写法:
-Dserver.port=9000
通常写在:
java -Dserver.port=9000 -jar app.jar
特点:
✔ 是 JVM 的系统属性
✔ Spring Boot 可以读取
✔ 优先级高于 application.properties,但低于 -- 命令行参数
✔ 经常用于:
- 端口
- profile
- 时区
- 日志路径等
🧩 3. VM 参数(JVM Options)
示例:
-Xmx1024m
-Xms512m
-XX:+PrintGCDetails特点:
✔ 只用于 JVM 内存、GC 优化
✘ Spring Boot 不能当配置来用
✘ 不会覆盖配置文件
✘ 和业务无关
🔍 直观结构化图
java
[VM参数] -Xmx -Xms -XX:...
[系统属性] -Dserver.port=9000
-jar app.jar
[命令行参数] --server.port=9001优先级顺序:
命令行参数(--) > 系统属性(-D) > 配置文件 > 默认
🧪 示例对比(非常清晰)
启动命令:
java -Xmx1g -Dserver.port=8001 -jar app.jar --server.port=9000解析:
| 参数 | 作用 |
|---|---|
-Xmx1g | JVM 最大内存 |
-Dserver.port=8001 | 系统属性:告诉 Spring Boot 默认端口 8001 |
--server.port=9000 | 命令行参数:最终端口为 9000 |
⭐ 最终记忆口诀
--xxx 是传给 Spring Boot 的命令行参数(最高优先)
-Dxxx 是 JVM 系统属性(中优先)
-Xxx 是 JVM 调优参数(Spring 不管)