由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦
在此之前首先须要理解两个对象:
在AnnotationConfigApplicationContext上下文对象实例化时,spring会实例化这两个对象,
AnnotatedBeanDefinitionReader对象顾名思义就是AnnotatedGenericBeanDefinition类型的bd的读取器,调用其register方法注册的bean注册的bd类型就是AnnotatedGenericBeanDefinition。
spring中通过注解启动spring容器时使用的AnnotationConfigApplicationContext上下文对象中会传入一个JAVA-Config类,这个类注册的bd就是AnnotatedGenericBeanDefinition。
我们也可以通过调用AnnotationConfigApplicationContext#register方法将须要的对象注册为bean,当然其bd类型也是AnnotatedGenericBeanDefinition,不过这个无所谓。
ClassPathBeanDefinitionScanner对象顾名思义就是类路径下的bd扫描器,可以通过传入一个包路径扫描加了@Component;@Service;等表示一个bean的java文件,并转换成BeanDefinition类型。
我们也可以通过调用AnnotationConfigApplicationContext#scan方法将指定目录下的一些对象注册为bd。
spring注册bd主要是依赖的ConfigurationClassPostProcessor这个类,他是spring中最最重要的一个类,实现了BeanDefinitionRegistryPostProcessor接口,这个接口又继承自BeanFactoryPostProcessor,所以这个类在spring初始化注册bd时发挥着重要的作用。
spring会在初始化AnnotatedBeanDefinitionReader对象时顺带着将其注册为bd,看下这个AnnotationConfigUtils#registerAnnotationConfigProcessors方法:
当然这里还会注册其他的几个bd,都是spring初始化时须要用到的几个关键类,这里先注册,后面使用会根据bd来构建出这个bean。
之后,执行AnnotationConfigApplicationContext#refresh方法 ->
AnnotationConfigApplicationContext#invokeBeanFactoryPostProcessors方法 ->
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors方法
很明显,上面的方法顾名思义就是用来执行BeanFactoryPostProcessor的(BeanDefinitionRegistryPostProcessor也算是BeanFactoryPostProcessor)
invokeBeanFactoryPostProcessors方法中的执行顺序是这样的:
1.自定义(手动add进来的)BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
2.spring容器中实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
3.spring容器中实现了Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
4.spring容器中其他(实现了PriorityOrdered和Ordered之外的)BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
5.所有(包括自定义的和由spring管理的)BeanDefinitionRegistryPostProcessor的父类BeanFactoryPostProcessor的postProcessBeanFactory方法
6.所有自定义的BeanFactoryPostProcessor的postProcessBeanFactory方法
7.所有spring管理的BeanFactoryPostProcessor(实现了PriorityOrdered接口)的postProcessBeanFactory方法
8.所有spring管理的BeanFactoryPostProcessor(实现了Ordered接口)的postProcessBeanFactory方法
9.所有spring管理的BeanFactoryPostProcessor(实现了PriorityOrdered和Ordered之外的)的postProcessBeanFactory方法
ConfigurationClassPostProcessor就是在第二步(postProcessBeanDefinitionRegistry)和第五步(postProcessBeanFactory)中执行的,Spring注册各种BeanDefinition都是在这里执行的。
ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry ->
ConfigurationClassPostProcessor#processConfigBeanDefinitions ->
ConfigurationClassParser#parse
这里获取到的bdNames其实就是上面说的spring自己注册的几个bd,另外就是再加一个我们添加的加了@Configuration注解的那个配置类的bd了。
走到这里,spirng会对bd类型做判断,这里会走第一个,因为我们手动注册的配置类的bd的类型是AnnotatedGenericBeanDefinition,AnnotatedGenericBeanDefinition就是AnnotatedBeanDefinition的子类。
可以看下AnnotationConfigApplicationContext#register方法:
继续走:
ConfigurationClassParser#processConfigurationClass ->
ConfigurationClassParser#doProcessConfigurationClass
就是在这里解析配置类的各种注解的(@ComponentScans;@ComponentScan;@Import;@Bean)