spring源码阅读之bean加载过程(一)
内容提要
本文介绍了阅读Spring源码的步骤,包括版本选择、源码下载和IDEA导入。作者选择了5个版本,并演示了编译和运行Spring源码的过程。文章还介绍了Bean加载过程和相关测试用例。下一期将介绍注解的类生成过程、循环注入和抽象类加载。
延伸解读
环境搭建中的版本匹配要点
文章强调Spring源码与Gradle版本需保持一致,否则命令可能报错。作者通过gradle-wrapper.properties查看对应关系,并将默认下载改为本地文件。编译spring-oxm时,JDK 8报错,改用JDK 21成功,网上有说11也可以但未验证。这提醒读者:搭建源码环境时,版本兼容性是首要排查点,不同模块对JDK要求可能不同。
从测试用例切入源码阅读的方法
作者选择FactoryBeanTests#testFactoryBeanReturnsNull作为切入点,先假设自己设计类似功能会怎么做,再对照Spring类图分析。这种方法将复杂源码拆解为解析XML、生成Bean、存入Map等步骤,降低了理解门槛。对于初学者,从可运行的测试用例出发,结合类图追踪调用链,比直接阅读核心类更易上手。
Bean加载流程的模块化设计
文章将Bean加载过程按颜色划分模块:黄色存储BeanDefinition,粉色解析Document生成BeanDefinition,绿色转换Resource为Document,蓝色作为入口和出口。模块间通过接口交互,即使入口不用XML,后续逻辑也可复用。这种设计保证了单一职责,虽然类图复杂,但结构合理,体现了Spring框架的可扩展性。
ClassPathXmlApplicationContext的复用逻辑
第二个测试用例singleConfigLocation展示了ClassPathXmlApplicationContext的初始化。它本质是ResourceLoader,先解析路径,再调用refresh()。refresh中obtainFreshBeanFactory()最终使用的BeanFactory正是DefaultListableBeanFactory,与第一个测试用例一致。后续preInstantiateSingletons将GenericBeanDefinition转为RootBeanDefinition,
Q&A
如何选择Spring源码的版本进行阅读?
可以选择想学习的版本,比如切换到5版本,确保下载对应的分支。
下载Spring源码后需要做哪些准备工作?
需要安装Gradle并将源码导入IDEA,同时保持Spring与Gradle的版本一致。
Bean加载过程的主要步骤是什么?
Bean加载过程包括解析XML、生成Bean并存储到一个地方,通常使用Map通过Bean的ID获取数据。
在编译Spring源码时需要注意什么?
需要确保JDK版本适配,作者使用JDK 21进行编译,避免使用不兼容的版本。
如何测试Bean的加载过程?
可以使用测试用例org.springframework.beans.factory.FactoryBeanTests#testFactoryBeanReturnsNull来验证Bean的加载。
下期文章将介绍哪些内容?
下期将介绍注解的类生成过程、循环注入和抽象类加载。