[email protected]源码解析
一、我们从AbstractApplicationContext#refresh()#invokeBeanFactoryPostProcessors开始分析,即调用BeanFactory的后置处理器
二、进入invokeBeanFactoryPostProcessors方法,调用PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
在该方法中我们按照类型BeanDefinitionRegistryPostProcessor.class获取相应的beanName,再根据beanName即可获取bean:ConfigurationClassPostProcessor(因为ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口)
根据上图流程,我们调用invokeBeanDefinitionRegistryPostProcessors方法,该方法中会调用后置处理器ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry()方法
获取所有注册了的所有的beanName,可以看到其中有我自定义的componentScanDemo(该类标注了@ComponentScan注解),然后进行遍历,根据beanName获取对应BeanDefinition,判断是否被@Configuration注解标注,并从中解析出注解元信息AnnotationMetaData,如果为true,通过BeanDefinitionHolder将BeanDefinition和beanName包装起来
下面的代码会返回true,因为componentScanDemo被标注了@ComponentScan注解
三、获取Bean的beanName生成器BeanNameGenerator
四、生成ConfigurationClassParser解析器,对该Configuration类进行解析
最终走到ConfigurationClassParser类的doProcessConfigurationClass进行Bean的解析
五、按照以下顺序对bean进行解析
1、先处理@PropertySource注解
2、再处理@ComponentScan注解,最终将@ComponentScan注解中标注的包下面的bean按照相应规则解析成BeanDefinition,然后注册BeanDefinition
3、处理@Import和@ImportSource注解
4、处理bean中被@Bean注解标注的方法
以上即是大致的处理流程