Spring中bean的真正实例化动作是由AbstractBeanFactory的createBean方法定义的,但是该类中该方法定义为抽象方法,即实际初始化动作交由子类去实现。在Spring中实现该方法的类是AbstractAutowireCapableBeanFactory。在实例化一个Bean的过程中,Spring给我们预留了很多扩展点。

上图中1-14均为初始化步骤,16-18均为销毁步骤
扩展点
- InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
在1中可以通过实现该接口的该方法阻止Spring原生的初始化动作,只要该方法的返回值不为null,则接下来的初始化动作只剩14,该方法的返回值将被作为BeanPostProcessor#postProcessBeforeInitialization的bean入参 - MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
在3中可以通过实现该接口的该方法修改运行时的BeanDefinition - InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
在4中可以通过实现该接口的该方法阻止Spring的bean属性注入动作,返回false即可 - InstantiationAwareBeanPostProcessor#postProcessProperties
在4中可以通过实现该接口的该方法改写bean即将注入的属性值 - BeanPostProcessor#postProcessBeforeInitialization
这时bean的属性值已经被填充好了,如果该方法返回值为null,则剩下的 BeanPostProcessor#postProcessBeforeInitialization不会被执行 - BeanPostProcessor#postProcessAfterInitialization
这时bean的属性值已经被填充好了,如果该方法返回值为null,则剩下的 BeanPostProcessor#postProcessAfterInitialization不会被执行 - DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
在16中可以通过实现该接口的该方法完成bean销毁前的回调
网友评论