目录
一、postProcessBeforeInstantiation
二、determineCandidateConstructors
三、postProcessMergedBeanDefinition
五、postProcessAfterInstantiation
六、postProcessProperties、postProcessPropertyValues
七、postProcessBeforeInitialization
八、postProcessAfterInitialization
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);