[email protected]源码解析

一、我们从AbstractApplicationContext#refresh()#invokeBeanFactoryPostProcessors开始分析,即调用BeanFactory的后置处理器

[email protected]源码解析

二、进入invokeBeanFactoryPostProcessors方法,调用PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

[email protected]源码解析

在该方法中我们按照类型BeanDefinitionRegistryPostProcessor.class获取相应的beanName,再根据beanName即可获取bean:ConfigurationClassPostProcessor(因为ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口)

[email protected]源码解析

[email protected]源码解析

根据上图流程,我们调用invokeBeanDefinitionRegistryPostProcessors方法,该方法中会调用后置处理器ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry()方法

[email protected]源码解析

获取所有注册了的所有的beanName,可以看到其中有我自定义的componentScanDemo(该类标注了@ComponentScan注解),然后进行遍历,根据beanName获取对应BeanDefinition,判断是否被@Configuration注解标注,并从中解析出注解元信息AnnotationMetaData,如果为true,通过BeanDefinitionHolder将BeanDefinition和beanName包装起来

[email protected]源码解析

[email protected]源码解析

下面的代码会返回true,因为componentScanDemo被标注了@ComponentScan注解

[email protected]源码解析

[email protected]源码解析

三、获取Bean的beanName生成器BeanNameGenerator

[email protected]源码解析

四、生成ConfigurationClassParser解析器,对该Configuration类进行解析

[email protected]源码解析

最终走到ConfigurationClassParser类的doProcessConfigurationClass进行Bean的解析

[email protected]源码解析

五、按照以下顺序对bean进行解析

1、先处理@PropertySource注解

[email protected]源码解析

2、再处理@ComponentScan注解,最终将@ComponentScan注解中标注的包下面的bean按照相应规则解析成BeanDefinition,然后注册BeanDefinition

[email protected]源码解析

[email protected]源码解析

3、处理@Import和@ImportSource注解

[email protected]源码解析

4、处理bean中被@Bean注解标注的方法

[email protected]源码解析

以上即是大致的处理流程