错误介绍
错误原因分析
在使用Nacos-Config-SpringBoot
时,有使用者反馈说无法支持@ConditionalOnProperty
注解,经过研究Nacos-Config-SpringBoot
、Nacos-Spring-Context
源码以及调试跟踪SpringBoot
的初始化流程,最终发现问题所在——@ConditionalOnProperty
的解析时间与Nacos-Spring-Context
相关Bean
的注册以及工作时间存在先后问题(其本质原因就是Bean
的加载顺序)
@ConditionalOnProperty解析时间
要想知道@ConditionalOnProperty
注解何时被Spring
解析,首先要看另外一个类——ConfigurationClassPostProcessor
,这个类实现了BeanFactoryPostProcessor
接口,因此他可以在Spring
的bean
创建之前,对bean
进行修改,即Spring
允许BeanFactoryPostProcessor
在容器实例化任何其他bean
之前读取配置元数据,并根据其进行修改,就比如@ConditionalOnProperty
注解常用来根据配置文件的相关配置控制是否需要创建相应的bean
。
核心代码
ConfigurationClassPostProcessor
执行、装载时机
refreshContext(context);
@Override
protected final void refreshBeanFactory() throws BeansException {
...
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
this.beanFactory = be