最近Springboot项目集成加入了nacos配置中心,然后在nacos配置了以下配置
但是在启动项目的时候仍然报错
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
NACOS中配置的spring的这个属性未生效。
经过跟进代码,最终发现和集成nacos的时候的一个配置有关
nacos.config.bootstrap.log.enable 默认false。
springboot项目启动时候
SpringApplication的run方法
第一步会先加载配置文件resource
方法里面listener执行模版方法environmentPrepared() 去加载各个配置文件,比如*.properties,.yml 之类的
最终是执行ConfigFileApplicationListener组件的onApplicationEvent()方法,调用处会获取所有的EnvironmentPostProcessor Bean分别去加载
然而com.alibaba.boot.nacos.config.autoconfigure.NacosConfigEnvironmentProcessor#postProcessEnvironment的方法做了判断
只有nacos.config.bootstrap.log.enable 为true的时候才会去加载这个配置。
这个时候配置文件加载完了后,会给SpringApplication 的一些属性赋值,就是 spring.main.xxx
如果nacos.config.bootstrap.log.enable=false, 此时nacos配置的spring.main.xxx属性是还没有加载的,也就是配置在nacos的配置不生效的原因。解决次问题就配置为true,或者spring.main.xxx配置在.properties文件或者.yml文件上。
那如果nacos.config.bootstrap.log.enable=false时,nacos配置是在什么地方加载的呢,继续跟进代码,run方法去预处理context的时候加载的nacos
获取所有的ApplicationContextInitializer 初始化一些配置
正好nacos autoconfigure 中实现了此接口com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer#initialize
此类在nacos.config.bootstrap.log.enable=false || nacos.config.bootstrap.enable=false的时候才会去加载nacos的配置。
这个地方很神奇的是为什么不都已nacos.config.bootstrap.enable 去判断在哪加载。
本次问题代码分析到此。