述
配置类,是我们在 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() 的处理逻辑: