在Springboot里经常能看到各种以@Conditional
开头的条件注解,比较常见的有@ConditionalOnClass、@ConditionalOnBean
,这里看下他们的实现原理。Springboot加载bean可以简单概括为三个阶段:
1、根据配置的扫描路径找到所有需要加载的类,并封装成BeanDefinition
注册到Spring容器
2、实例化所有注册到容器的BeanDefinition
3、对已经实例化的bean进行依赖注入
这是最主要的三步,在这过程中还穿插这很多的后置处理器,这些条件注解的判断逻辑是在第一步的时候起作用,用来判断这个类是否满足条件,满足条件则封装成BeanDefinition
注册到Spring容器,Springboot通过ComponentScanAnnotationParser
的parse方法来扫描并解析所有的bean,在这个方法的里会通过ClassPathBeanDefinitionScanner
来扫描类,最终会通过ConditionEvaluator
类的shouldSkip
方法检查所扫描的类是否符合条件,而逻辑就是通过条件注解上指定的条件判断类的match方法来判断是否符合条件,代码截图如下,有兴趣的可以自己debug下:
每个条件注解上都会有个@Conditional
注解并指定具体的判断逻辑实现类:
获取注解信息的代码如下: