在 Spring Boot / Spring Cloud Alibaba Nacos 体系里,“优先级”本质取决于 PropertySource 的加载顺序:后加载(或更高优先级)的会覆盖先加载的。结合常见用法,你可以按下面规则记:

1)结论速记(最常见场景)

本地配置 vs Nacos 配置:通常是 本地 > Nacos。

因为:

  • application.yml / application.properties 属于本地应用配置(ApplicationConfig),一般会作为高优先级 PropertySource;
  • Nacos 的外部配置一般作为额外 PropertySource 注入,优先级通常低于本地 application.*(但高于一些系统默认)。

所以同一个 key(比如 server.port)同时在本地和 Nacos 出现时,通常以本地为准。

2)更完整的优先级梯队(从高到低,常见项)

  1. 命令行参数:--key=value
  2. 系统属性:-Dkey=value
  3. 环境变量:KEY=value
  4. 本地应用配置:application.yml/properties(以及 profile:application-dev.yml 等)
  5. Nacos 外部配置(spring.config.import=nacos:... 或 legacy bootstrap 方式加载的配置)
  6. 默认值(代码里 @Value("${key:default}") 的 default、框架默认)

只要你没做特殊改动(比如调整 PropertySource 顺序),基本可以按这个理解。

3)容易踩坑的点

A. “bootstrap” 时代(老版本 Spring Cloud)

老写法 bootstrap.yml + spring-cloud-starter-bootstrap 会让“外部配置”更早介入,但是否一定压过本地 application,仍取决于具体版本和 PropertySource 插入位置;实际项目里仍然经常看到 本地覆盖 Nacos 的结果。

B. Nacos 内部也有覆盖优先级

如果你在 Nacos 配了多个 DataId(例如 app.yaml + app-dev.yaml + shared.yaml),则一般:

  • 更具体的(profile) 覆盖 更通用的(默认/共享)
  • 后加载的 DataId 覆盖 先加载的 DataId

C. “refresh” 只刷新 Nacos 那一层

就算开启热更新,@RefreshScope 刷新的也是 Nacos 那层 PropertySource;如果本地配置已经覆盖它,刷新也看不到变化。

4)你要的是一句最实用的话

同 key 冲突时:通常本地 application.yml 覆盖 Nacos。真正最高的是命令行/系统属性/环境变量。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐