Spring Framework 源码阅读与笔记
题目:Bean 的生命周期管理
- 阅读 Spring 框架中 Bean 生命周期管理的相关源码,如
AbstractBeanFactory
、BeanPostProcessor
等。 - 分析 Bean 从创建到销毁的各个阶段,以及如何通过
BeanPostProcessor
进行拦截和处理。
笔记
1 核心类与方法介绍
1.1 AbstractBeanFactory
类
AbstractBeanFactory
是 Spring BeanFactory 的核心抽象类,负责管理 Bean 的整个生命周期。它将 Bean 的创建、初始化、依赖注入、销毁等操作抽象出来。
关键方法:
getBean()
:用于获取 Bean,先检查缓存,避免重复创建。doGetBean()
:实现主要的创建和初始化逻辑。createBean()
:执行 Bean 的实例化、依赖注入和初始化。initializeBean()
:初始化过程中调用BeanPostProcessor
的postProcessBeforeInitialization
和postProcessAfterInitialization
方法,并执行初始化方法。
1.2 BeanPostProcessor
接口
BeanPostProcessor
是 Spring 中的扩展接口,用于在 Bean 初始化前后进行自定义处理。
关键方法:
postProcessBeforeInitialization()
:初始化前对 Bean 进行处理。postProcessAfterInitialization()
:初始化后对 Bean 进行处理(如代理增强)。
BeanPostProcessor
使得 Bean 的创建过程可插拔,常用于实现 AOP。
2 Bean 生命周期的主要阶段
2.1 实例化(Instantiation)
通过 createBeanInstance()
方法创建 Bean,使用反射调用构造器。
2.2 属性填充(Dependency Injection)
通过 populateBean()
进行依赖注入,设置 Bean 的依赖属性。
2.3 初始化前处理(Pre-Initialization)
在初始化前,Spring 调用 postProcessBeforeInitialization()
方法进行预处理。
2.4 初始化(Initialization)
调用 Bean 的初始化方法。若 Bean 实现了 InitializingBean
接口或配置了初始化方法,则执行相关方法。
2.5 初始化后处理(Post-Initialization)
初始化后,Spring 调用 postProcessAfterInitialization()
方法进行后处理。
2.6 销毁(Destruction)
容器关闭时,Spring 调用销毁方法,如 DisposableBean
接口的 destroy()
或自定义销毁方法。
3 源码结构分析
3.1 AbstractBeanFactory
类
负责 Bean 的创建、初始化、依赖注入和销毁等操作。
关键逻辑:
getBean()
:检查缓存,缓存未命中时调用doGetBean()
创建 Bean。doGetBean()
:完成 Bean 的创建与初始化。createBean()
:通过反射创建 Bean,进行依赖注入和初始化。initializeBean()
:调用BeanPostProcessor
方法并执行初始化方法。
3.2 BeanPostProcessor
接口
提供了对 Bean 初始化前后的处理能力。
关键逻辑:
postProcessBeforeInitialization()
:初始化前的处理逻辑。postProcessAfterInitialization()
:初始化后的处理逻辑(如增强)。
3.3 getBean()
方法分析
通过调试 getBean()
,可以看到缓存检查过程和 doGetBean()
中的创建与初始化过程。
调试点:
- 缓存检查:检查缓存是否已有 Bean。
doGetBean()
:未命中缓存时,进入 Bean 创建流程。
3.4 createBean()
方法分析
createBean()
负责实际的实例化、依赖注入和初始化过程。
调试点:
- 实例化:通过反射创建 Bean。
- 依赖注入:执行
populateBean()
,填充 Bean 的依赖。 - 初始化:调用
initializeBean()
,执行初始化逻辑。
3.5 BeanPostProcessor
的处理
BeanPostProcessor
允许在 Bean 初始化前后插入自定义处理逻辑。
调试点:
- 初始化前:查看
postProcessBeforeInitialization()
方法的处理过程。 - 初始化后:分析
postProcessAfterInitialization()
方法的处理过程。
4 知识点总结
- Bean 生命周期管理:Spring 通过
AbstractBeanFactory
管理 Bean 从创建到销毁的完整生命周期。 BeanPostProcessor
拦截机制:允许在 Bean 初始化前后执行自定义逻辑,是 AOP 的基础。- 初始化方法调用:支持自动识别
InitializingBean
接口和自定义初始化方法,确保 Bean 正确初始化。 - 销毁方法调用:支持通过
DisposableBean
和自定义方法进行销毁处理,释放资源。
5 设计模式总结
5.1 代理模式(Proxy Pattern)
- 应用场景:
BeanPostProcessor
实现了代理模式,允许在 Bean 初始化前后加入自定义处理(如 AOP 增强)。 - 优势:将增强逻辑与业务逻辑分离,实现无侵入式的 Bean 增强。
5.2 工厂模式(Factory Pattern)
- 应用场景:
AbstractBeanFactory
负责创建和管理不同类型的 Bean 实例。 - 优势:封装 Bean 创建逻辑,提升代码可读性和可扩展性。
5.3 模板方法模式(Template Method Pattern)
- 应用场景:
AbstractBeanFactory
提供了 Bean 生命周期管理的基本流程,具体逻辑由子类实现。 - 优势:提取通用逻辑,子类可灵活扩展,保证框架的可扩展性和可维护性。
本文作者:鸿·蒙
文档工具:Typora
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鸿·蒙 !