【Spring源码系列- IOC】
本文目录
checkConfigurationClassCandidate()方是用来检查给定的BeanDefinition是否是一个配置类的候选者(或一个在配置/组件类中声明的嵌套组件类),并对其进行相应的标记处理的 第一步,当然是先获取bean定义信息中的class类名,不符合要求则直接返回false
由于通过注解注入的BeanDefinition都是AnnotatedGenericBeanDefinition,实现了AnnotatedBeanDefinition,而Spring内部的BeanDefinition都是RootBeanDefinition,实现了AbstractBeanDefinition checkConfigurationClassCandidate()方法在获取到class类名以后,则先判断了是否实现了AnnotatedBeanDefinition(通过注解注入的BeanDefinition)
再判断了是否实现了AbstractBeanDefinition(Spring内部的BeanDefinition)
从上述代码可以看出,有4种类是不在此进行处理的(原因是什么? 欢迎了解的大佬指导.抱拳.gif):
-
BeanFactoryPostProcessor.class
-
BeanPostProcessor.class
-
AopInfrastructureBean.class
-
EventListenerFactory.class
如果上述两种情况都不符合,就直接获取className的MetadataReader实例,读取底层类的完整注解元数据
处理完上述3种情况后,获取被@Configuration注解标注的Bean Definition的元数据属性的字典值
-
如果字典值为proxyBeanMethods的属性值为false且被@Configuration注解修饰,则将其configurationClass属性值设为full
-
如果是被isConfigurationCandidate()方法中列出的注解修饰,则将其configurationClass属性值设为lite
isConfigurationCandidate()详解
检查是否被特定注解修饰,这里的特定的包含4个:
-
Component.class
-
ComponentScan.class
-
Import.class
-
ImportResource.class
关于"full" & "lite"
-
"full"用于修饰@Configuration注解修饰的注解类
-
"lite"用于修饰非@Configuration注解修饰的注解类
最后,设置bean的order值
(*≧ω≦)🎉🎉🎉