Spring 核心机制 · 深度剖析
Spring 核心:IoC 容器、依赖注入与 AOP
把 Spring 从一堆"注解魔法"还原成一台可预测的对象图装配机——看清每个 bean 走的固定生命周期,以及挂在生命周期节点上的扩展点。这是面试要考的那一层。
·适合谁
面向学过 Spring、想补深度和原理的工程师——尤其是准备面试、想把"会用注解"升级成"讲得出背后机制"的人。需要具备:
- 能读写 Java:类、接口、注解、反射的基本概念不陌生。
- 用过 Spring 或 Spring Boot:写过
@Service/@Autowired/@RestController,但不清楚容器启动时到底发生了什么。 - 遇到过"
@Transactional没生效""循环依赖报错""注入了个 null"这类问题,想知道根因而不只是绕过去。
·不适合谁
- 完全没碰过 Java 的人:先补 Java 语法与反射,再回来。
- 只想快速搭一个能跑的项目:去看 Spring Boot 的 starter 与自动配置教程,本文不教 Boot,只挖核心容器的内核。
- 想学 Spring MVC / Data / Security:那些是建在本文这套容器之上的上层模块,本文是地基。读完地基再上去会快很多。
·读完之后你能做到什么
读完,你能像读过源码的人那样,把任何一个 Spring "魔法"注解(@Autowired / @Transactional / @Async)还原成"某个 BeanPostProcessor 在 bean 生命周期的哪个固定节点、做了什么"——这是官方文档只讲"怎么用"、讲不出的那一层。具体可验证的能力:
- 画出
ApplicationContext.refresh()的主干步骤,并说清"两类后置处理器"各在什么时机、改的是什么。 - 解释
@Autowired注入发生在生命周期的哪一步、由哪个组件完成,而不只说"Spring 自动注入"。 - 讲清循环依赖的三级缓存为什么是"三级"而不是两级,以及为什么构造器注入的循环依赖无解。
- 判断一个
@Transactional/@Async在什么写法下会静默失效,并说出根因(自调用绕过代理)。 - 在"构造器注入 vs 字段注入""Spring AOP vs AspectJ""注解 vs Java 配置"之间,按场景给出有依据的选择。
一句话本质
Spring 容器是一台确定性的"对象图装配机":每个 bean 都走同一条固定生命周期——实例化 → 属性填充 → 初始化——而 @Autowired 注入、AOP 代理、@Transactional 这些"魔法",本质上全是 BeanPostProcessor 挂在这条生命周期固定节点上的回调。没有魔法,只有扩展点。把"生命周期 + 后置处理器"这条主线吃透,Spring 就从注解魔法变成一台可预测的状态机。
核心容器模型(IoC/DI、bean 生命周期、proxy-based AOP)自 Spring 3/4 起十余年稳定,本教程讲的就是这套内核,长期有效。现代分水岭是 6.0(2022-11) 的两个硬变更——Java 17 基线 与 Jakarta 命名空间迁移(javax.* → jakarta.*)——以及 AOT 处理 + GraalVM 原生镜像 对 bean 注册方式的重塑(构建期固化代理、原生镜像下建议 @Configuration(proxyBeanMethods=false))。7.0(2025-11 GA) 延续这套内核,并把重试等弹性能力并入 spring-core。javax.* 与 XML-first 配置已是历史,不应作为当前实践学习。
这份教程讲的是机制,不是 API 清单。机制类内容最容易制造"懂了"的错觉。盯住这三句心里话——它们出现时,恰恰说明你还没学进去:
· 「我读得很顺」——顺,往往是因为面熟,不是因为真的能复述机制。合上页面,能讲出 bean 生命周期的三步吗?
· 「我做题很快」——题答得快,往往是因为碰到的是背过的标准题型;判别层的场景题换个壳,就未必答得动。
· 「我没卡壳」——没卡壳,往往是因为你只是在看字,没在脑子里跑那条装配流程。每章末的自测就是用来戳破这层错觉的,别跳过。
·概念地图
下面这张图是全教程的骨架。中心是 IoC 容器,朱红色高亮的 BeanPostProcessor 是贯穿后三章的主角——后面所有"魔法"都挂在它身上。
BeanPostProcessor,而 AOP 代理又由它生成。这两条朱红线就是 02、03 两章的主线。·怎么读这份教程
- 只想搞懂原理
按 01 → 02 → 03 顺序读,02 是核心,别跳。读完做 04 的自测。 - 面试急救
先读 01 把术语对齐,重点啃 02(生命周期 + 三级缓存)和 03(代理 + 自调用失效)——这两章是高频考点。04 的判别题模拟面试追问。 - 带读他人代码 / 排查问题
遇到具体问题(注入了 null、事务没生效)直接跳 03 的失败模式,再回 02 看根因机制。
·目录
·学完之后
- Spring Boot 自动配置:理解了 BFPP/BPP 与条件装配,再看 starter 与
@Conditional,会发现 Boot 只是这套机制的一层约定封装。 - Spring 事务传播机制:在 03 章"代理 = AOP"的基础上,深入
@Transactional的 7 种传播行为与PlatformTransactionManager。 - AspectJ 编译期 / 加载期织入:当 Spring 代理式 AOP 不够用(字段、构造器、自调用)时的进阶方案。
- AOT 与 GraalVM 原生镜像:把运行期反射装配搬到构建期——本教程的机制在原生镜像下如何被固化。