1.前置知识
一个bean在加入spring容器之前,首先要读取class文件生成BeanDefinition,然后通过BeanDefinition实例化bean,BeanDefinition就是一个用来描述bean如何被创建出来的对象,最后执行bean的初始化。
在spring中有两种Processor,一种是BeanFactoryPostProcessor,另一种是BeanPostProcessor。
BeanFactoryPostProcessor:主要是给BeanFactoryPost注册BeanDefinition,存入beanDefinitionMap,也只有加入到beanDefinitionMap以后,才会执行spring后期的bean生命周期。
BeanPostProcessor:主要是在bean依赖注入完成以后,在bean初始化过程中会对每一个bean都回调里面的实现的两个方法。
2.整体流程
以下下是基于springboot2.x进行分析。
主要包括以下核心步骤:
2.1
调用createApplicationContext();加入几个核心的Processor的BeanDefinition,有BeanFactoryPostProcessor和BeanPostProcessor。
2.2
调用invokeBeanFactoryPostProcessors(beanFactory);这方法首先会把org.springframework.context.annotation.ConfigurationClassPostProcessor
这个BeanFactoryPostProcessor的对象创建好,放入到单例池中,另外还会创建几个spring容器内部的bean也加入到单例池中。这个过程执行结束以后,所有需要加入的spring容器的bean相对应的BeanDefinition都已经加入到beanDefinitionMap中了。
调用postProcessBeanDefinitionRegistry(registry);这个方法首先要获取一个包路径,默认就是启动类所在的包(如果加了@ComponentScan,则使用配置的basePackages做为包路径)。然后开始扫描这个包以及子包中包含@Component注解的类(包括@Componet@Service@Configuration…),然后把这些类封装成BeanDefinition放入beanDefinitionMap中。
其中@Configuration这个注解处理的时候,会把里面的通过@Bean标注的方法对应的bean也会扫描并加入到beanDefinitionMap。
其中@Import这个注解导入其他配置类的时候,也会把里面的通过@Bean标注的方法对应的bean也会扫描并加入到beanDefinitionMap。
2.3
执行registerBeanPostProcessors(beanFactory);这个方法首先创建好BeanpostProcessor的对象,放入单例池中,同时也会在加入到Beanfactory中的beanPostProcessors这个list列表中,初始化过程中回调BeanpostProcessor方法的时候,就是遍历这个list中的每一个BeanpostProcessor然后调用里面的方法。有些内置的BeanpostProcessor是在之前就加入了,但是执行依赖注入的BeanPostProcessor就是在这个阶段创建好对象,并且加入到beanPostProcessors的list列表中。
3.总结
大概分析了前面几个过程,梳理一下这几个过程大概就是:
》》》》》
加入spring内部BeanFactoryPostProcessor和BeanPostProcessor对应的BeanDefinition到beanDefinitionMap中
》》》》》
创建ConfigurationClassPostProcessor这个BeanFactoryPostProcessor的对象,用来扫面项目中需要加入spring容器的bean,扫描是把类的信息封装成BeanDefinition存入到beanDefinitionMap。
》》》》》
创建BeanPostProcessor对象并且存入到spring容器中,后续在bean初始化阶段会进行回调使用。
路漫漫其修远兮,吾将上下而求索。
标签:ApplicationContext,加入,spring,BeanFactoryPostProcessor,beanDefinitionMap,程序员,bean From: https://blog.csdn.net/a273967581/article/details/142568792