文章目录
- 前言
- 一、PostProcessor分类
- 二、BeanFactoryPostProcessor
- 1. 如何注册
- 2.何时使用
- 3.相关类
- 三、BeanPostProcessor
- 1. 如何注册
- 2.何时使用
- 3.相关类
- 总结
前言
今天想聊聊Spring中的PostProcessor,毕竟作为一种被广泛使用的扩展方式,在spring生态下的其他组件中非常常见。
一、PostProcessor分类
个人理解存在2个大类,BeanFactoryPostProcessor和BeanPostProcessor。简单理解,就是在BeanFactory和Bean两个颗粒度上的PostProcessor。接下来,针对每一类的PostProcessor怎么注册,怎么使用,以及典型应用做进一步的讨论。
二、BeanFactoryPostProcessor 1. 如何注册首先,BeanFactoryPostProcessor最终作用在BeanFactory上,这意味着应用BeanFactoryPostProcessor之前BeanFactory得确实存在。从OOP的角度,前者不关心后者是具体的哪一个,后者根本不知道前者的存在。因此,BeanFactoryPostProcessor是通过ApplicationContext的addBeanFactoryPostprocessor添加,最终保存在属性List beanFactoryPostProcessors。
2.何时使用ApplicationContext在refresh阶段,由invokeBeanFactoryPostProcessors完成apply。
3.相关类三、BeanPostProcessor 1. 如何注册
CustomScopeConfigure: 完成自定义scope实现的注册,为后续的Bean创建做准备;
BeanDefinitionRegistryPostProcessor:在BeanDefinition完成注册后做后处理,比如子类ConfigurationClassPostProcessor对@Configuration注解相关增强处理;
BeanPostProcessor最终作用在Bean上,这意味着每次获取Bean都需要做必要的PostProcessor。因此,BeanPostProcessor注册在BeanFactory中,通过addBeanPostProcessor添加,最终保存在属性List beanPostProcessors。
2.何时使用Spring中管理了整个Bean的生命周期从实例化,初始化到对象消亡。实际上,BeanPostProcessor名字有点儿忽悠人,因为有的PostProcessor甚至直接影响Bean的实例化。
3.相关类InstantiationAwareBeanPostProcessor接口定义内容如下
- 实例化前处理postProcessBeforeInstantiation
- 实例化后处理postProcessAfterInstantiation
- 初始化之前对属性值的处理postProcessProperties
这里需要注意,如果postProcessBeforeInstantiation返回值非空,那么将阻断Spring的实例创建流程,而是进入后续的初始化阶段。如果目标bean需要通过工厂方法完成创建,那么该方法不会被apply。
总结
以上就是今天要讲的内容,今天我们聊了聊Spring中的PostProcessor,其中包含BeanPostProcessor和BeanFactoryPostProcessor。对于BeanPostProcessor中的方法postProcessBeforeInstantiation,在使用过程中还请注意,避免踩坑。感谢你的阅读,如果本文对你有帮助,烦请让我知晓。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)