✅ 正确的 Spring Boot 配置优先级(从高到低)
Spring Boot 官方文档中的配置属性优先级大致如下(精简版本):
优先级 | 来源 | 示例 |
---|---|---|
1️⃣ | 命令行参数(args[]) | --server.port=9090 |
2️⃣ | JVM 系统属性 | -Dserver.port=8081 |
3️⃣ | 操作系统环境变量 | SERVER_PORT=8082 |
4️⃣ | application.yml 或 .properties | server.port: 8083 |
5️⃣ | @Value("${server.port:8080}") 的默认值 | :8080 是最末尾兜底值 |
📌 所以你的理解没错,只是:
@Value("${...:default}")
中的default
不属于 Spring Boot 的配置来源体系本身。- 它只是 Spring 表达式语言(SpEL)中的兜底默认值,仅在上面所有来源都没有值时才生效。
✅ 举个完整的例子说明:
我们来看如下启动命令:
java -Dserver.port=8081 -jar app.jar --server.port=9090
并且 application.yml
中:
server:
port: 7070
代码中写:
@Value("${server.port:6060}")
int port;
那么最终 port
的值是:9090
解释:
- 命令行参数
--server.port=9090
→ ✅ 优先级最高 - JVM 参数
-Dserver.port=8081
→ ✅ 被覆盖 - yml 中的
7070
→ ✅ 被覆盖 @Value
中的6060
默认值 → ❌ 根本不会生效
✅ @Value("${xxx:默认值}")
的角色定位
它不是 Spring Boot 中某种配置来源,它只是:
在找不到这个配置项时,用的临时值,作为兜底。
不会替代或干扰 Spring Boot 配置系统的优先级逻辑。
✅ 总结修正你的提法:
你说的是对的,只需要再精确一点措辞:
原话 | 推荐修正 |
---|---|
Spring Boot 命令行参数优先级最高 | ✅ 正确 |
其次是 Java 系统属性 | ✅ 正确 |
之后是 application.yml 文件 | ✅ 正确 |
最后是 @Value("${server.port:8080}") 类型 | ⚠️ 应该说:“${} 中的默认值只有在找不到任何配置时才生效,不属于 Spring Boot 的配置体系优先级” |