Spring Bean后置处理器解析

目录

 

Spring Bean后置处理器解析

一、postProcessBeforeInstantiation

二、determineCandidateConstructors

三、postProcessMergedBeanDefinition

四、getEarlyBeanReference

五、postProcessAfterInstantiation

六、postProcessProperties、postProcessPropertyValues

七、postProcessBeforeInitialization          

八、postProcessAfterInitialization

九、requiresDestruction


Spring Bean后置处理器解析

 

前言:Spring IoC容器可以通过插入特殊的集成接口实现进行扩展。

BeanPostProcessor接口定义了可以实现的回调方法,以提供您自己的(或覆盖容器的默认)实例化逻辑,依赖关系解析逻辑等。 如果要在Spring容器完成实例化,配置和初始化bean之后实现某些自定义逻辑,则可以插入一个或多个BeanPostProcessor实现

Spring 系列产品,都是基于Bean的后置处理器,将相应的功能植入到Spring中,使其更强大,更方便,更好用。

可以通过后置处理器,在我们bean的创建过程中做出相应的调整(回调相应的后置处理器),从而使bean成为符合我们需求的bean。

下面介绍Spring IOC在加载bean的时候调用的九大后置处理器

 

一、postProcessBeforeInstantiation

第一个bean后置处理器,在创建bean之前调用,可以通过该后置处理器自己创建bean,而不走后面spring帮我们创建bean的过程,如果是我们自己完成bean的创建,则会调用BeanPostProcessor.postProcessAfterInitialization
InstantiationAwareBeanPostProcessor  ==>  postProcessBeforeInstantiation(beanClass, beanName);

在创建bean(doCreateBean) 之前调用,createBean(beanName, mbd, args);  => resolveBeforeInstantiation(beanName, mbdToUse); => applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
如果是通过该处理器自行创建bean,则不会执行后面的spring创建bean的过程,代码如下,执行 applyBeanPostProcessorsAfterInitialization => postProcessAfterInitialization(result, beanName);

 

二、determineCandidateConstructors

第二个后置处理器,在实例化bean的时候调用的,具体的是在instantiateBean(beanName, mbd)之前,可以指定实例化的构造函数
SmartInstantiationAwareBeanPostProcessor ==》 determineCandidateConstructors(beanClass, beanName);

doCreateBean(beanName, mbdToUse, args) => createBeanInstance(beanName, mbd, args) =>  determineConstructorsFromBeanPostProcessors(beanClass, beanName)

 

三、postProcessMergedBeanDefinition

第三个后置处理器,在实例化bean(createBeanInstance)之后,在属性赋值(populateBean)之前,@AutoWired @Value预解析
MergedBeanDefinitionPostProcessor ==> postProcessMergedBeanDefinition(mbd, beanType, beanName);

doCreateBean(beanName, mbdToUse, args) =>  applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)

 

四、getEarlyBeanReference

第四个后置处理器,在实例化bean(createBeanInstance)之后,在属性赋值(populateBean)之前,用于解决循环依赖中的AOP
SmartInstantiationAwareBeanPostProcessor  ==》 getEarlyBeanReference(exposedObject, beanName);

doCreateBean(beanName, mbdToUse, args) => addSingletonFactory => getEarlyBeanReference(beanName, mbd, bean)

 

五、postProcessAfterInstantiation

第五个后置处理器,在属性赋值(populateBean)的时候调用,具体是在真正赋值之前,可以通过该后置处理器停止对属性的赋值
InstantiationAwareBeanPostProcessor  ==》 postProcessAfterInstantiation(bw.getWrappedInstance(), beanName);

doCreateBean(beanName, mbdToUse, args) =>  populateBean(beanName, mbd, instanceWrapper); =>  postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)

 

六、postProcessProperties、postProcessPropertyValues

第六个后置处理器,在bean的property属性注入完毕,这里是在spring处理完默认的成员属性,应用到指定的bean之前进行回调,可以用来检查和修改属性,最终返回的PropertyValues会应用到bean中 @Autowired、@Resource等就是根据这个回调来实现最终注入依赖的属性的
InstantiationAwareBeanPostProcessor  ==》     postProcessProperties(pvs, bean, beanName);
                                            postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);

doCreateBean(beanName, mbdToUse, args) =>  populateBean(beanName, mbd, instanceWrapper); =>  ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);  =>  ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);                                      
                     

七、postProcessBeforeInitialization          

第七个后置处理器,因为是BeanPostProcessor是最上层的接口,所以所有的后置处理器中的postProcessBeforeInitialization()方法都会被调用。在属性赋值后,调用初始化方法(invokeInitMethods)前调用,比如@PostContruct 就是通过该处理器调用的
BeanPostProcessor  ==》 postProcessBeforeInitialization(result, beanName); 

doCreateBean(beanName, mbdToUse, args) =>  initializeBean(beanName, exposedObject, mbd); => applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);    
    
注:初始化方法(invokeInitMethods) ,如:afterPropertiesSet 或 init-method 这种

 

八、postProcessAfterInitialization

第八个后置处理器,因为是BeanPostProcessor是最上层的接口,所以所有的后置处理器中的postProcessAfterInitialization()方法都会被调用。在调用初始化方法(invokeInitMethods)后进行调用。比如AOP也就是在这个后置处理器中创建代理的
BeanPostProcessor  ==》  postProcessAfterInitialization(result, beanName);

 

 

九、requiresDestruction

第九个后置处理器,将bean注册为一次性的,将给定的bean添加到此工厂的一次性bean列表中,注册其DisposableBean接口和/或给定的销毁方法,在工厂关闭时调用(如果适用)。只适用于单例
DestructionAwareBeanPostProcessor  ==》 requiresDestruction(bean)

doCreateBean(beanName, mbdToUse, args) =>  registerDisposableBeanIfNecessary(beanName, bean, mbd); => new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc) =>  filterPostProcessors(postProcessors, bean);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值