INDEX · Spring
Spring 核心机制源码索引
阅读方法:每篇聚焦一条机制,把关键几个类的源码串起来(代码块 + 精炼注释)。Spring 源码是跨类的机制链,不像单个 JDK 类自洽。建议按下面顺序读:先 IOC 主干,再循环依赖,然后 AOP,最后事务(事务本质就是 AOP 的应用)。
核心机制
| 机制 | 关键类 | 一句话 |
|---|---|---|
| IOC-refresh | AbstractApplicationContext | 容器启动主干 refresh() 十二步,从加载 BeanDefinition 到实例化单例 |
| Bean创建-doCreateBean | AbstractAutowireCapableBeanFactory | getBean 到 doCreateBean 主线:实例化、属性注入、初始化四步 |
| 循环依赖-三级缓存 | DefaultSingletonBeanRegistry | 三级缓存(成品 / 半成品 / 工厂)解决 setter 注入的循环依赖 |
| AOP-动态代理 | AbstractAutoProxyCreator | 后置处理器织入代理,JDK 动态代理 vs CGLIB |
| 事务-Transactional | TransactionInterceptor | @Transactional 本质是 AOP 环绕通知,传播行为与失效场景 |
| SpringBoot-启动与自动配置 | SpringApplication | run() 主线与 AutoConfigurationImportSelector 的候选加载 + 条件过滤 |
| SpringMVC-DispatcherServlet | DispatcherServlet | doDispatch 主线:HTTP 请求如何变成 @RequestMapping 方法调用 |
机制之间的关系
- IOC 是地基:所有 bean 由 refresh() 创建,AOP 和事务都是在 bean 创建过程中「插一脚」。
- AOP 靠后置处理器:
AbstractAutoProxyCreator是BeanPostProcessor,在 bean 初始化后判断要不要包成代理。 - 事务是 AOP 的应用:
@Transactional没有独立机制,就是一个特殊的环绕通知TransactionInterceptor,所以 AOP 的失效场景(自调用)事务全都有。 - 循环依赖三级缓存与 AOP 咬合:第三级
singletonFactories存的工厂,正是为了在需要时提前生成 AOP 代理,保证注入进去的是代理对象而非原始对象。