Spring Boot-16-配置类解析流程

配置类,是我们在 Spring Boot 项目中经常使用的, 就是用 @Configuration 注解修饰的类, 然后在配置类中,我们可以使用 @Bean 注解修饰一个方法, 这个方法返回的 class 对象,就会被注入到 Spring 容器中,下面我们来大致了解一下 Spring Boot 框架中配置类的解析流程

源码回顾

配置类其实是在我们之前说过的 refresh() 方法中处理的,具体的在 invokeBeanFactoryPostProcessors() 这个方法中,我们之前有详细介绍过,这里我们先来回顾一下这个方法

image

配置类的解析,就在其中一个 BeanDefinitionRegistryPostProcessor 中就是 ConfigurationClassPostProcessor, 我们来看一下他的 postProcessBeanDefinitionRegistry() 方法

配置类解析

进入 ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry() ,如下:

image

然后这里先做了判断, 重点逻辑在 processConfigBeanDefinitions() 这个方法中,点进去

ConfigurationClassPostProcessor$processConfigBeanDefinitions()

image

这里首先是两个判断,重点关心一下 ConfigurationClassUtils.checkConfigurationClassCandidate() 这个判断的逻辑

ConfigurationClassUtils$checkConfigurationClassCandidate()

点进去这个方法,也是比较长,分开来看

image

这一步,主要做一些判断,然后拿到类的元数据,一般来说我们都是用的注解,所以会进入第一个 if 判断中,最终获取到类的元数据 metadata ,然后往下

image

根据获取到的元数据,做了两个判断,首先第一个判断是判断是否是 @Configuration 类, 如果不是的话,会进入第二个 if 条件,这里调用了一个 isConfigurationCandidate() 方法来做判断, 我们进去看一下具体的判断逻辑

image

这里用到的 candidateIndicators 这个集合的属性如下

image

总体来说,就是判断是不是这4个类型的注解,然后如果不是的话最后判断这个类里有没有方法用了 @Bean 的注解

回到前面的 ConfigurationClassUtils$checkConfigurationClassCandidate() 方法中,这两个判断,如果是 @Configuration 注解的类,则会设置一个 Attribute,key是常量 CONFIGURATION_CLASS_ATTRIBUTE 值是 full, 另一种情况的值是 lite

最后获取一下排序的值,设置一下返回

回到 ConfigurationClassPostProcessor$processConfigBeanDefinitions() 方法中,继续往下看

image

上面的判断返回 true 的话,会new一个 BeanDefinitionHolder 对象,然后添加到 configCandidates 集合中去,然后做个排序,继续往下看

image

这里的do-while循环,就是具体的解析逻辑,我们下文中详细分析

总结

具体的流程就是上面这样, 最后画画图做个总结

配置类解析入口:

image

postProcessBeanDefinitionRegistry() 的处理逻辑:

image

processConfigBeanDefinitions() 的处理逻辑:

image