一,背景:
之前在使用 Nacos 的时候有个疑问,同样的 key,在 Nacos 配置了,在 application 也配置了,到底会有哪个呢?一直没空查,后来在网上看到过文章,说 Nacos 是在 application 之后,所以相同的 key ,Nacos 的值会覆盖掉 application。实践出真知,决定实际操作看一下。
结论:相同的 key,Nacos 不会因为是后加载的,就覆盖原来的 application 的值。
二,版本、配置及代码:
1,版本:
nacos-server:2.2.3
nacos-config-spring-boot-starter: 0.2.12
spring-boot:2.7.16
2,配置:
application 配置:
nacos 配置:
3,代码:
期望:返回 abc1546422222222:abc1546422222222
实际:返回 1233:1233
三,分析开始
项目启动时打断点,来到
org.springframework.core.env.PropertySourcesPropertyResolver#getPropertyAsRawString
1,获取 key 的配置值:
abc:1 这个 key 一定是不存在的,因为会有默认值,此时处理是:先根据这个 key 找,找不到,则需要按照 : 拆分,得出真正的 key ,再去查一次,如果还查不到,则需要把 1 这个默认值返回。
2,所以第二次来到了:此时 key 为 abc
此时就找到了 application 中配置的值:
点开这个 propertySource 看一下里面具体的信息:
看第6 、7条,第 6 条就是从 applicaion 得出的值:
第 7 条,是从 nacos 获取的值:
但是!从第 6 条里已经找到了 key 为 abc 的值,则此时会直接返回:
不会再去遍历找 nacos 里的值。所以此时就是 application 中的值。
后续再分析本地配置文件的加载顺序。