在使用Nacos做配置中心的时候发现,nacos相关的配置如果不写在bootstrap.properties里面是没有效果的。
如是我在NacosConfigProperties的fileExtension属性上打了给断点,我发现当配置写在bootstrap.properties时set方法的断点会先进去,然后再进get方法的,但是当配置写在application.yml文件上时就是相反的。
![](https://i-blog.csdnimg.cn/blog_migrate/86b2ff4ecc4688cf7d49d5e6e9fd260a.png)
然后我就去看SpringBoot启动的方法
![](https://i-blog.csdnimg.cn/blog_migrate/74578ba5c44b50c84511b6b081b620c6.png)
第一个断点准备环境的方法里面会调用listeners.environmentPrepared((ConfigurableEnvironment)environment);触发一个ApplicationEnvironmentPreparedEvent 事件
而BootstrapApplicationListener监听了这个事件,就会调用到onApplicationEvent方法,这里会创建一个父容器去加载bootstrap相关的类
![](https://i-blog.csdnimg.cn/blog_migrate/d1383bc0a0cd983304bcc9ddf7c41475.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f490f9c6ffd3dd7ceddf5789db99fe84.png)
BootstrapImportSelectorConfiguration 会通过spi导入NacosConfigBootstrapConfiguration从而初始化NacosConfigProperties,但是这时候只会加载bootstrap.properties里面的配置(?),所以nacos的配置写在bootstrap.properties才有作用
![](https://i-blog.csdnimg.cn/blog_migrate/99c7a25c9afec809f759e426d2abeec5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/afc66c21a0ba3599cd09bd5ca6c54b55.png)
this.addAncestorInitializer(application, context); 在后面子容器实例化的时候会设置容器
![](https://i-blog.csdnimg.cn/blog_migrate/74578ba5c44b50c84511b6b081b620c6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2b549e0e14cdbe1efc08e0700cd79c02.png)
这里会去设置父容器,然后加载nacos配置
而子容器加载的方法在this.prepareContext 之后,所以如果nacos配置不在bootstrap.properties里面那么,在获取nacos配置的时候NacosConfigProperties里面就没有值,而是等到子容器加载完了才有值