bean的生命周期包含实例化,属性赋值,初始化,使用,销毁等五个阶段。如果我们想在Spring容器创建bean的过程中做点小动作该如何做呢?这个就涉及到后置处理器BeanPostProcessor与InstantiationAwareBeanPostProcessor了,在这里我们先介绍一下BeanPostProcessor,它是针对 bean 的扩展,主要是用在 bean 实例化之后,执行初始化方法前后,让开发人员可以对 bean 实例进行修改。高度概括一下它的工作就是在 bean 的初始化前后做一些额外的处理。当然如果存在多个BeanPostProcessor的实例并且想指定先后顺序执行,这个实则也是可以的,只要设置 order 属性就可以控制这些 BeanPostProcessor 实例的运行顺序。
BeanPostProcessor 是一个接口,它定义了两个方法。一个为postProcessBeforeInitialization一个为postProcessAfterInitialization 。

1:postProcessBeforeInitialization
postProcessBeforeInitialization 方法会在 bean 的初始化回调之前执行。
2:postProcessAfterInitialization
postProcessAfterInitialization 方法会在 bean 的初始化回调之后执行。
目前我们测试一下,我们新建一个HaizeiwangBeanPostProcessor类继承BeanPostProcessor方法,并重写其中的postProcessBeforeInitialization 与postProcessAfterInitialization 方法。
在bean初始化之前我们判断如果是haizeiwang的bean实例则进行一些属性赋值操作,我们运行一下看看控制台会输出什么。


我们发目前haizeiwang这个bean初始化之前进入postProcessBeforeInitialization方法,我们做了属性赋值操作。控制台输出如下所示。我们发目前初始化之前海贼王这个bean里的name与remark字段都是null.当我们重写了postProcessBeforeInitialization方法判断如果bean的实例为haizeiwang则赋值。所以在初始化之后haizeiwang的两个字段就有值了。

这个时候我有个疑问,postProcessBeforeInitialization与postProcessAfterInitialization的入参bean都为Object,如果我是个开发人员误操作返回一个null怎么办?我们可以试一下看看返回是什么。我们发现结果还是一样。


为什么我们postProcessBeforeInitialization方法最终返回的是null,但是postProcessAfterInitialization输出的还是与原来一样呢?我们debug可以看一下,发现当returnnull的时候进入到AbstractAutowireCapableBeanFactory下的applyBeanPostProcessorsBeforeInitialization方法。里面判断这个content如果为null,则直接返回当前的bean。


