第七篇 再读Spring之 PostProcessor

第七篇 再读Spring之 PostProcessor,第1张


文章目录
  • 前言
  • 一、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.相关类
  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,在使用过程中还请注意,避免踩坑。感谢你的阅读,如果本文对你有帮助,烦请让我知晓。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/797964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存