Spring Boot 中配置属性的优先级

✅ 正确的 Spring Boot 配置优先级(从高到低)

Spring Boot 官方文档中的配置属性优先级大致如下(精简版本):

优先级来源示例
1️⃣命令行参数(args[])--server.port=9090
2️⃣JVM 系统属性-Dserver.port=8081
3️⃣操作系统环境变量SERVER_PORT=8082
4️⃣application.yml.propertiesserver.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

解释:

  1. 命令行参数 --server.port=9090 → ✅ 优先级最高
  2. JVM 参数 -Dserver.port=8081 → ✅ 被覆盖
  3. yml 中的 7070 → ✅ 被覆盖
  4. @Value 中的 6060 默认值 → ❌ 根本不会生效

@Value("${xxx:默认值}") 的角色定位

它不是 Spring Boot 中某种配置来源,它只是:

在找不到这个配置项时,用的临时值,作为兜底。

不会替代或干扰 Spring Boot 配置系统的优先级逻辑。


✅ 总结修正你的提法:

你说的是对的,只需要再精确一点措辞:

原话推荐修正
Spring Boot 命令行参数优先级最高✅ 正确
其次是 Java 系统属性✅ 正确
之后是 application.yml 文件✅ 正确
最后是 @Value("${server.port:8080}") 类型⚠️ 应该说:“${} 中的默认值只有在找不到任何配置时才生效,不属于 Spring Boot 的配置体系优先级”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值