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