前言

spring容器在加载阶段,有一些非常重要类似于埋点的设计(这个概念叫法不统一,有的称为“后置处理器”)。本文暂且以接口的字面意思叫作后置处理器(PostProcessor)。这些后置处理器的设计扩展了spring容器的功能。它允许自定义不同类型的后置处理器,实现外部对bean和beandefinition的处理节点、加载时机等的干预,从而满足项目的个性化需求。

Spring中的后置处理器

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

spring源码解析 - spring后置处理器埋点设计
AnnotationConfigApplicationContext容器实现,对以上三大组件的注册点
spring源码解析 - spring后置处理器埋点设计

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

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

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

对应的源码实现
spring源码解析 - spring后置处理器埋点设计

Bean实例化前置阶段
spring源码解析 - spring后置处理器埋点设计

PostProcessorRegistrationDelegate.registerBeanPostProcessors()提前实例化BeanPostProcessor组件,以便后面实例化其它bean时使用
spring源码解析 - spring后置处理器埋点设计

Bean实例化后置阶段br/>AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()处理@Bean,factoryMethod等外部实例化埋点
spring源码解析 - spring后置处理器埋点设计

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

spring源码解析 - spring后置处理器埋点设计
AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors()收集bean对象的依赖属性和方法注入等信息
spring源码解析 - spring后置处理器埋点设计

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

spring源码解析 - spring后置处理器埋点设计
AbstractAutowireCapableBeanFactory.initializeBean()对bean对象生成Aop动态代理的相关处理
spring源码解析 - spring后置处理器埋点设计

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

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

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

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

后置处理器的应用

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

结束语

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