Spring 源码分析——Bean 容器扩展机制 Processor
本篇文章讨论 Spring 源码中 Bean 容器扩展机制
对应 Github 源码完整文档:https://github.com/TyCoding/mini-spring/tree/main/docs/ioc/06-bean-processor
引言
在之前讲 Bean 生命周期时有说到,在 Bean 实例化、初始化前后会自动加载很多扩展类以影响实例化或者初始化的结果。这里提到的扩展类其实主要有两种:XxxPostProcessor
接口和XxxAware
接口。(本章节仅讲解XxxPostProcessor
接口)
两个在 Bean 实例化和初始化阶段最常见的接口:
-
BeanFactoryPostProcessor: Bean 实例化之前调用,修改容器的配置元数据以影响 Bean 实例化结果; -
BeanPostProcessor: Bean 实例化后初始化前调用,修改 Bean 属性值影响 Bean 初始化结果;
**简单理解:**根据名称可以认为 Factory 是更偏向工厂底层的,因此它会影响最开始的 Bean 实例化;而 Bean 初始化操作则放在 Factory 产生的示例后。

BeanPostProcessor
从上图中我们要引入两个接口:ListableBeanFactory 和 HierarchicalBeanFactory;我们知道 BeanFactory 是getBean()
获取 Bean 的入口;而 Spring 用于快速管理 Bean 提供了几种扩展接口:
-
ListableBeanFactory:能够列出所有 Bean 的 BeanFactory 接口扩展,可以快速访问某个 Bean 实例 -
HierarchicalBeanFactory:对 BeanFactory 父子层级关系、依赖关系的管理 -
ConfigurableBeanFactory:提供灵活配置和管理 BeanFactory 中的 Bean 对象 -
ConfigurableListableBeanFactory:ListableBeanFactory 接口扩展
其实说到这里已经有点绕了,因为在 Spring 源码中这块的设计很复杂,我们可以简单认为上面的扩展接口都是为了方便快捷的管理 Bean 和 BeanFactory 对象;而在这里我们讨论的XxxPostProcessor
接口就是其中一个子接口负责管理的;我们只针对XxxPostProcessor
接口做一个图例说明:

首先我们知道AbstractAutowireCapableBeanFactory
抽象类实现了创建 Bean 的具体逻辑,其中整体上包含了两个步骤:实例化、初始化;那么这里我们要实现的XxxPostProcessor
接口只需要在AbstractAutowireCapableBeanFactory
实例化和初始化 Bean 前后调用XxxPostProcessor
接口也就实现了我们的目的。
从上图我们简单分析BeanPostProcessor
的执行流程:
-
首先在 BeanPostProcessor 对象中分别定义两个函数,用于分别在初始化前后执行; -
实现 ConfigurableBeanFactory 接口,调用 addBeanPostProcess
写入 BeanPostProcessor(这一步应该在 Spring 容器加载时就统一注册进去);addBeanPostProcess
函数具体的实现在 AbstractBeanFactory 类中,具体是加载到一个 List 容器中. -
AutowireCapableBeanFactory 接口提供两个函数分别提供 Bean 初始化前后调用执行( applyBeanPostProcessorBeforeInitialization
),对应从 BeanPostProcessor 容器中循环调用对应的初始化前后的函数(postProcessorBeforeInitialization
)
测试
由于篇幅原因,这部分需要实现的代码类比较多,这里就不再展示了,从上面的图例中我们已经整体分析了实现流程,具体的代码实现案例请参看文档:https://github.com/TyCoding/mini-spring/tree/main/docs/ioc/06-bean-processor

Spring 源码专栏
此专栏将从 Spring 源码角度整体分析 Spring 设计思路以及常见的面试题。
配套作者的手写 Spring 的项目:https://github.com/TyCoding/mini-spring 。该项目中包含各个阶段的开发文档,有关 Spring 源码更详细的分析测试文档请查阅:https://github.com/TyCoding/mini-spring/tree/main/docs
联系我
-
个人博客:http://tycoding.cn/ -
GitHub:https://github.com/tycoding -
微信公众号:程序员涂陌 -
QQ 交流群:866685601
原文始发于微信公众号(程序员涂陌):Spring源码分析——Bean容器扩展机制
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/145599.html