Spring在bean的创建过程中9次执行后置处理器BeanPostProcessor

从AbstractAutowireCapableBeanFactory 的createbean方法开始

 

其中的createBean方法是单例对象从BeanDefinition到bean实例的实际方法

 

beanPostProcess只是顶层接口,它会贯穿所有spring的bean的实例化和初始化的阶段

 

第一次执行:

要不要走bean的创建流程,要么接着往下走流程创建bean要么返回程序员给的对象,直接返回

 

resolveBeforeInstantiation ,获取所有后置处理器,判断是否为InstantiationAwareBeanPostProcessor实现类型,调用的方法

InstantiationAwareBeanPostProcessor的 postProcessBeforeInstantiation

这个后置处理器很关键,InstantiationAwareBeanPostProcessor有3个方法,第一个方法postProcessBeforeInstantiation如果你直接返回一个“自建对象”的话,那spring上下文直接就会把你的这个对象放入容器中,并执行BeanPostProcessor的postProcessAfterInitialization方法。如果第一个方法返回为null,则spring创建bean的流程会继续执行,会在populateBean方法中继续调用postProcessAfterInstantiation和postProcessPropertyValues来进行属性的装配。

如果配置文件加了@EnableAspectJAutoProxy注解,就会import功能注册一个InstantiationAwareBeanPostProcessor的子类AnnotationAwareAspectJAutoProxyCreator进行类的过滤,出现@AspectJ的类标记为不需要代理的类,会被放入map中。

 

第二次:决定创建实例用哪个构造方法,此处完成之后就立马反射用构造方法创建出还未初始化的对象了

 

在createBeanInstance中的determineConstructorsFromBeanPostProcessors方法中,判断是否为SmartInstantiationAwareBeanPostProcessor类型的后置处理器,调用的方法是:determineCandidateConstructors,这个方法用来推断构造函数,看用哪个构造函数实例对象,实际使用的实现SmartInstantiationAwareBeanPostProcessor接口的AutowiredAnnotationBeanPostProcess后置处理器去做的。

 

 

第三次:解析并缓存注解信息,方便后边使用

在createBeanInstance中的applyMergedBeanDefinitionPostProcessors方法中,判断为MergedBeanDefinitionPostProcessor,调用的方法是:postProcessMergedBeanDefinition,目的是用来缓存注解信息,方便后续使用  包括三个后置处理器

CommonAnnotationBeanPostProcessor处理并缓存

@PostConstruct @PreDestroy@WebServiceRef, @EJB, @Resource   

 

AutowiredAnnotationBeanPostProcessor处理并缓存

@Autowired

ApplicationListenerDetector很简单,将beanName和是否是singleton的boolean变量放到ApplicationListenerDetector对象的Map<String, Boolean> singletonNames中

 

第四次:为解决循环依赖中,对象提早暴露的问题,一般情况下直接暴漏出来,在有aop动态代理时提前返回代理后的对象,此处有个小瑕疵,虽然代码实在这,实际执行时在populateBean()的属性注入中

 

 

 

第五个方法:判断是否要进行属性的依赖注入 一般情况下都是true 

在populateBean中的会调用InstantiationAwareBeanPostProcessor这个处理器,调用的方法是:postProcessAfterInstantiation 

第六个方法:进行属性的依赖注入

在populateBean中的又会调用InstantiationAwareBeanPostProcessor这个处理器,但是调用的方法是postProcessPropertyValues

这里干活的有两个 ,CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor。前者处理@Resource注解,后者处理@Autowired注解

最终都是由

 beanFactory.resolveDependency()来找到需要的实例来注入,如果属性实例还没有被创建就先创建,这里面就会有循环依赖的问题,这时候第四次的处理就发挥价值了,思路就是把实例化后、还没初始化、正在创建中的(这几个描述比较重要)对象放在一个map中暴露出来,先关联上再说,等属性实例创造好后,再注入

第七个方法:依次回调bean后置处理器的postProcessBeforeInitialization方法

主要有以下三个

 1.ApplicationContextAwareProcessor

ApplicationContextAwareProcessor依靠它内部invokeAwareInterfaces方法实现了以下Aware接口bean的初始化工作

2  ImportAwareBeanPostProcessor

 如果实现了ImportAware接口,在postProcessBeforeInitialization中首先解析出importingClass,使得bean能感知到importingClass

3.  CommonAnnotationBeanPostProcessor 用来执行前面缓存的@PostConstruct方法
CommonAnnotationBeanPostProcessor会实际调用InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization方法执行

 

第八个方法:一切都做了之后,对创建好的bean对象进行处理

在initializationBean中调用的是BeanPostProcess的postProcessAfterInitialization方法

在我所见至中只有aop的 AbstractAutoProxyCreator实现了这个方法,这里就是做aop动态代理的地方

具体的

 

 

第九个 是注册销毁方法时,找到在第三步缓存的方法并返回,这个感觉不咋重要,我也没认真看

 

new DisposableBeanAdapter() 构造方法中的最后一行

 

点进去

其实就是第三次缓存在InitDestroyAnnotationBeanPostProcessor的@PreDestroy方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章