Spring源码分析——Bean容器扩展机制

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 产生的示例后。

Spring源码分析——Bean容器扩展机制
img

BeanPostProcessor

从上图中我们要引入两个接口:ListableBeanFactory 和 HierarchicalBeanFactory;我们知道 BeanFactory 是getBean()获取 Bean 的入口;而 Spring 用于快速管理 Bean 提供了几种扩展接口:

  • ListableBeanFactory:能够列出所有 Bean 的 BeanFactory 接口扩展,可以快速访问某个 Bean 实例
  • HierarchicalBeanFactory:对 BeanFactory 父子层级关系、依赖关系的管理
  • ConfigurableBeanFactory:提供灵活配置和管理 BeanFactory 中的 Bean 对象
  • ConfigurableListableBeanFactory:ListableBeanFactory 接口扩展

其实说到这里已经有点绕了,因为在 Spring 源码中这块的设计很复杂,我们可以简单认为上面的扩展接口都是为了方便快捷的管理 Bean 和 BeanFactory 对象;而在这里我们讨论的XxxPostProcessor接口就是其中一个子接口负责管理的;我们只针对XxxPostProcessor接口做一个图例说明:

Spring源码分析——Bean容器扩展机制
image-20230424171441440

首先我们知道AbstractAutowireCapableBeanFactory抽象类实现了创建 Bean 的具体逻辑,其中整体上包含了两个步骤:实例化、初始化;那么这里我们要实现的XxxPostProcessor接口只需要在AbstractAutowireCapableBeanFactory实例化和初始化 Bean 前后调用XxxPostProcessor接口也就实现了我们的目的。

从上图我们简单分析BeanPostProcessor的执行流程:

  1. 首先在 BeanPostProcessor 对象中分别定义两个函数,用于分别在初始化前后执行;
  2. 实现 ConfigurableBeanFactory 接口,调用addBeanPostProcess写入 BeanPostProcessor(这一步应该在 Spring 容器加载时就统一注册进去);addBeanPostProcess函数具体的实现在 AbstractBeanFactory 类中,具体是加载到一个 List 容器中.
  3. AutowireCapableBeanFactory 接口提供两个函数分别提供 Bean 初始化前后调用执行(applyBeanPostProcessorBeforeInitialization),对应从 BeanPostProcessor 容器中循环调用对应的初始化前后的函数(postProcessorBeforeInitialization

测试

由于篇幅原因,这部分需要实现的代码类比较多,这里就不再展示了,从上面的图例中我们已经整体分析了实现流程,具体的代码实现案例请参看文档:https://github.com/TyCoding/mini-spring/tree/main/docs/ioc/06-bean-processor

Spring源码分析——Bean容器扩展机制
img

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!