spring源码解析 – spring后置处理器埋点设计

前言

spring容器在加载阶段,有一些非常重要类似于埋点的设计(这个概念叫法不统一,有的称为“后置处理器”)。本文暂且以接口的字面意思叫作后置处理器(PostProcessor)。这些后置处理器的设计扩展了spring容器的功能。它允许自com.cn/tag/%e5%ae%9a%e4%b9%89" target="_blank">定义不同类型的后置处理器,实现外部对bean和beandefinition的处理节点g E w | f L )、加载时机等的干预,从而满足项目的个性化: % I 1 $需求。

Spring中的后置处理器

spring源码解析 - spring后置处理器埋点设计
其中最重要的三大组件为:ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor等。
下面我们先来看下以上组件在spring源码中的埋点(处理节点设计)
BeanDefinition注册阶段
Cl5 7 [ - x R : h #assPathXmlApplicationContext容器实现,对以上三大组件的注册点
spring源码解析 - spring后置处理器埋点设计

spring源码解析 - spring后置处理器埋点设计
AnnotationConfigApplic$ m % ( m 6 }ationContext容器实现,对以上三大组件的注册点

spring源码解析 - spring后置处理器埋点设计
触发BeanDefinition干预阶段
spring源码解析 - spring后置处理器埋点设计

spring源码解析 - spring后置处理器埋点设计

具体处理流程
spring源码解析 - spring后置处理器埋点设计

对应的源码实现

Bean实例化前置阶M y $ * I

PostProcessorRegistrationDelegate.registerBeanPostProcessors()提前实例化BeanPos g T = h M } UtProcessor组件,以便后面实例化其它bean时使用

Bean实例化后置阶段br/>AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()处理@Bean,factoryMethod等外部实例化埋点

spring源码解析 - spring后置处理器埋点设计


AbstractAutowireCap` , H Y [a& } m ; ` i L BbleBeanFactory.+ V x 5 applyMergedBeanDefi? t $ T @ n anid 2 ) 8 y EtionPostProcessors2 m S = $ e ()收集bean对象的依赖属性和方法注入等信息

spring源码解析 - spring后置处理器埋点设计
AbstractAutowireCapableBeanFactory.populateBean()bean对象依赖注入赋值
spring源码解析 - spring后置处理器埋点设计


AbstractAutowi[ o YreCapableBeanFactory.initializeBean()对bean对象生成Aop动态代理的I 9 P & _ 2 N a相关处理
spring源码解析 - spring后置处理器埋点设计

spring源码解析 - spring后置处理器埋点设计

spring源码解析 - spring后置处理器埋点设计

后置处理器的应用

三大后置处理器,在实际项目使用得并不是很多,但也有项目会使用到如下的场景:1.在. I gbea? k g $ ^ J zndefinition注册后,需要在运行时对容器中的beandefinition进行增强或干预;2.在bean实例化过程中,某个类不希望在spring中进行实例化;3.希G { ] 1望容器启动后,做? A q ~ t 7 ] L一些全局的业务逻辑;4.开发spring的插件需要和spring进行集成或对接等。下面就举例看一F 4 8 G h ; q H ^些自定义后置处理器的场景:
BeanDefinitionRegistryPostProcessor扩展
spring源码解析 - spring后置处理器埋点设计
BeanFK [ ? S ?actoryPostProcesser扩展
spring源码解析 - spring后置处理器埋点设计
InitializingBean,Bean实例化扩展

结束语

关于spring后置处理器的N l l / I r源码就暂时分享到这里,更多后置处理器的使用场景,有兴趣的可以花时间研s r d究一下spring容器加载过程的源码。这种东西,使用场景并不像注解那7 F A样普遍,但也有它的用武之地(尤其是K u ` ki z ^ + _设计或架构)。大家可以根据自己的项目和工作角色进行选择。今天就到这里,更多spring源码的干货,请继续关注!