述
配置类,是我们在 Spring Boot 项目中经常使用的, 就是用 @Configuration
注解修饰的类, 然后在配置类中,我们可以使用 @Bean
注解修饰一个方法, 这个方法返回的 class 对象,就会被注入到 Spring 容器中,下面我们来大致了解一下 Spring Boot 框架中配置类的解析流程
源码回顾
配置类其实是在我们之前说过的 refresh()
方法中处理的,具体的在 invokeBeanFactoryPostProcessors()
这个方法中,我们之前有详细介绍过,这里我们先来回顾一下这个方法
配置类的解析,就在其中一个 BeanDefinitionRegistryPostProcessor
中就是 ConfigurationClassPostProcessor
, 我们来看一下他的 postProcessBeanDefinitionRegistry()
方法
配置类解析
进入 ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()
,如下:
然后这里先做了判断, 重点逻辑在 processConfigBeanDefinitions()
这个方法中,点进去
ConfigurationClassPostProcessor$processConfigBeanDefinitions()
这里首先是两个判断,重点关心一下 ConfigurationClassUtils.checkConfigurationClassCandidate()
这个判断的逻辑
ConfigurationClassUtils$checkConfigurationClassCandidate()
点进去这个方法,也是比较长,分开来看
这一步,主要做一些判断,然后拿到类的元数据,一般来说我们都是用的注解,所以会进入第一个 if 判断中,最终获取到类的元数据 metadata ,然后往下
根据获取到的元数据,做了两个判断,首先第一个判断是判断是否是 @Configuration
类, 如果不是的话,会进入第二个 if 条件,这里调用了一个 isConfigurationCandidate()
方法来做判断, 我们进去看一下具体的判断逻辑
这里用到的 candidateIndicators
这个集合的属性如下
总体来说,就是判断是不是这4个类型的注解,然后如果不是的话最后判断这个类里有没有方法用了 @Bean
的注解
回到前面的 ConfigurationClassUtils$checkConfigurationClassCandidate()
方法中,这两个判断,如果是 @Configuration
注解的类,则会设置一个 Attribute
,key是常量 CONFIGURATION_CLASS_ATTRIBUTE
值是 full
, 另一种情况的值是 lite
最后获取一下排序的值,设置一下返回
回到 ConfigurationClassPostProcessor$processConfigBeanDefinitions()
方法中,继续往下看
上面的判断返回 true 的话,会new一个 BeanDefinitionHolder
对象,然后添加到 configCandidates
集合中去,然后做个排序,继续往下看
这里的do-while循环,就是具体的解析逻辑,我们下文中详细分析
总结
具体的流程就是上面这样, 最后画画图做个总结
配置类解析入口:
postProcessBeanDefinitionRegistry()
的处理逻辑:
processConfigBeanDefinitions()
的处理逻辑: