Spring Framework 的核心价值不是“提供注解”,而是把对象创建、依赖解析、生命周期回调、代理和资源访问组织成可扩展的容器协议。本册基于 main @ c7712052ce953722448967dc9c780fa959a08d48(2026-08-13)阅读。
Spring Framework 的核心不是“容器里有很多 Bean”,而是把对象创建、依赖装配、横切逻辑和资源生命周期组织成可扩展的流程。本册沿着一个 Bean 从定义到销毁的生命周期阅读:
BeanDefinition 如何被解析成容器可以执行的计划?
refresh() 为什么必须先准备后置处理器,再实例化单例?
- Bean 的实例化、注入、初始化和代理创建为什么有固定顺序?
- 循环依赖为什么需要三级缓存,为什么构造器循环仍然无法解决?
- AOP、事务和资源转换如何插入主流程,而不是硬编码进每个业务对象?
- 测试上下文为什么可以缓存,缓存失效时又由谁负责隔离?
读完整册后,应当能解释“一个带有依赖、AOP 和事务的 Bean 是怎样变成最终可用对象的”。
| 项 |
值 |
| 仓库 |
spring-projects/spring-framework |
| 本地路径 |
E:\source\java\spring\spring-framework |
| 分支 |
main |
| Commit |
c7712052ce953722448967dc9c780fa959a08d48(2026-08-13) |
| 最近 tag |
v4.0.0.RC2(blobless 克隆中的祖先 tag,仅作参考) |
| 问题 |
Framework 的解法 |
| 对象创建与业务耦合 |
BeanFactory 管理定义、实例化和依赖注入 |
| 生命周期扩展点分散 |
BeanPostProcessor、Aware、Initializing/Disposable 回调统一编排 |
| 横切逻辑侵入业务 |
AOP 将 Advisor/Interceptor 织入代理 |
| 资源和配置来源不一致 |
Resource、Environment、ConversionService 抽象底层差异 |
| 模块 |
关键职责 |
spring-core |
资源、类型转换、环境、反射与基础工具 |
spring-beans |
BeanDefinition、BeanFactory、依赖解析与生命周期 |
spring-context |
ApplicationContext、事件、国际化与组件扫描 |
spring-aop |
Advisor、ProxyFactory、JDK/CGLIB 代理 |
spring-tx |
事务属性、拦截器与事务管理器抽象 |
spring-web / spring-webmvc |
Web 基础设施与 MVC 请求处理 |
AbstractApplicationContext#refresh():看容器启动的十几个扩展边界。
AbstractBeanFactory#doGetBean():看缓存命中、作用域和依赖创建。
AbstractAutowireCapableBeanFactory#createBean():看实例化、提前暴露和初始化。
DefaultSingletonBeanRegistry#getSingleton():看三级缓存和并发保护。
AbstractAutoProxyCreator#wrapIfNecessary():看后置处理器如何生成代理。
TransactionAspectSupport#invokeWithinTransaction():看事务边界如何包住目标调用。
| 对象 |
对照点 |
| Netty |
都把复杂流程拆成可组合扩展点;Netty 的核心 owner 是 EventLoop,Spring 的核心 owner 是 BeanFactory |
| MyBatis |
都通过工厂和后处理器隔离创建细节;Spring 负责对象图,MyBatis 负责会话和映射 |
| Redis 源码 |
Redis 选择显式生命周期和单线程状态,Spring 选择可插拔容器协议 |