随笔 - 303  文章 - 0  评论 - 3  阅读 - 15万

Spring 高级特性之二:后置处理器PostProcessor

  在Spring核心思想之 AOP:在自定义容器基础上实现AOP功能Spring核心思想之 AOP:如何影响DI并引入三级缓存解决DI中涉及代理的问题中都涉及了后置处理器。分析可知其影响盛广,在Spring中后置处理器,有哪些、分别在哪里使用、为什么这样用呢?

  Spring提供了如下后置处理器对容器中对象进行生命周期的管理:

    

   根据上图可知,实际bean对象涉及生命周期的主要是一个构造器和两个后置处理器(BeanFactoryPostProcessor和BeanPostProcessor)。我们以Dubbo框架为例验证上述结论,注解版配置类如下:

          

  关注@EnableDubbo中涉及bean生命周期的部分,跟踪发现涉及的后置处理器是beanFactoryPostProcessor有:

      DubboConfigAliasPostProcessor

      DubboConfigEarlyInitializationPostProcessor

  实例化:

 

   时序图:

   实例化成功后,在一级缓存中保存:

              

   那么调用呢?首先看下BeanFactoryPostProcessor接口的具体内容:

              

  那么确定postProcessBeanFactory的调用点即可。调试跟踪如下:

      

   以上跟踪调试分析,可知beanFactoryPostProcessor的实例化及调用均在refresh#invokeBeanFactoryPostProcessors中。

  类似,跟踪调试可分析出beanPostProcessor的实例化在refresh#registerBeanPostProcessors中,时序亦类似于beanFactoryPostProcessor。

  关于beanPostProcessor的调用,首先看下BeanPostProcessor接口的具体内容:

               

  其调用在哪里呢?以DubboConfigDefaultPropertyValueBeanPostProcessor这个bean后置处理器为例调试跟踪如下:

              

   上图总在finishBeanFactoryInitialization中初始化registryConfig的过程中调用了beanPostProcessor。其的调用过程可以参考责任链设计模式的相关内容(三、责任链模式 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com))。

  BeanPostProcessor与BeanFactoryPostProcessor的初始化、调用的不同时机,正是由于它们的作用不同导致作用域不同决定的。BeanPostProcessor是针对Bean级别的处理,可以针对某个具体的Bean;而BeanFactoryPostProcessor针对整个Bean的工厂(BeanFactory)进⾏处理。可以具化想象成一个是对产品颜色、大小的修饰,一个是对生成产品的流水线进行修饰,比如添加润滑剂使半成品更快流向下一个环节等。
  关于构造器的使用就赘述了——单例新建的时候都需要用到私有的构造器,这个应该比较容易理解。

posted on   池塘里洗澡的鸭子  阅读(595)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示