第七篇 再读Spring之 PostProcessor



前言

今天想聊聊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.相关类

  1. CustomScopeConfigure: 完成自定义scope实现的注册,为后续的Bean创建做准备;

  2. BeanDefinitionRegistryPostProcessor:在BeanDefinition完成注册后做后处理,比如子类ConfigurationClassPostProcessor对@Configuration注解相关增强处理;

三、BeanPostProcessor

1. 如何注册

BeanPostProcessor最终作用在Bean上,这意味着每次获取Bean都需要做必要的PostProcessor。因此,BeanPostProcessor注册在BeanFactory中,通过addBeanPostProcessor添加,最终保存在属性List beanPostProcessors。

2.何时使用

Spring中管理了整个Bean的生命周期从实例化,初始化到对象消亡。实际上,BeanPostProcessor名字有点儿忽悠人,因为有的PostProcessor甚至直接影响Bean的实例化。

3.相关类

InstantiationAwareBeanPostProcessor接口定义内容如下

  1. 实例化前处理postProcessBeforeInstantiation
  2. 实例化后处理postProcessAfterInstantiation
  3. 初始化之前对属性值的处理postProcessProperties

这里需要注意,如果postProcessBeforeInstantiation返回值非空,那么将阻断Spring的实例创建流程,而是进入后续的初始化阶段。如果目标bean需要通过工厂方法完成创建,那么该方法不会被apply。


总结

以上就是今天要讲的内容,今天我们聊了聊Spring中的PostProcessor,其中包含BeanPostProcessor和BeanFactoryPostProcessor。对于BeanPostProcessor中的方法postProcessBeforeInstantiation,在使用过程中还请注意,避免踩坑。感谢你的阅读,如果本文对你有帮助,烦请让我知晓。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值