Spring源码讲解(一)Spring注册BeanDefinition(解析配置类)

由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦

在此之前首先须要理解两个对象:

AnnotatedBeanDefinitionReader

在AnnotationConfigApplicationContext上下文对象实例化时,spring会实例化这两个对象,

AnnotatedBeanDefinitionReader对象顾名思义就是AnnotatedGenericBeanDefinition类型的bd的读取器,调用其register方法注册的bean注册的bd类型就是AnnotatedGenericBeanDefinition。

spring中通过注解启动spring容器时使用的AnnotationConfigApplicationContext上下文对象中会传入一个JAVA-Config类,这个类注册的bd就是AnnotatedGenericBeanDefinition。

我们也可以通过调用AnnotationConfigApplicationContext#register方法将须要的对象注册为bean,当然其bd类型也是AnnotatedGenericBeanDefinition,不过这个无所谓。

 

ClassPathBeanDefinitionScanner

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)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值