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