Spring 的内容很多,如果一开始就分散看注解、事务、MVC、AOP,很容易越看越乱。更好的方式是把它们串成一张学习地图。
这张地图可以分成五块:容器、依赖注入、MVC、事务、AOP 和启动机制。
容器是底座
Spring 的核心是容器。容器负责创建对象、管理生命周期、处理依赖关系,并把对象组织成 Bean。
学习容器时可以重点看:
- BeanFactory 和 ApplicationContext 的关系。
- BeanDefinition 是什么。
- refresh 流程大概做了哪些事。
- 注解扫描如何把类变成 Bean。
- BeanPostProcessor 为什么重要。
不需要一开始背完整源码,但要知道对象不是凭空出现的,是容器按规则创建和装配的。
依赖注入解决对象协作
依赖注入让业务类不用自己 new 依赖对象,而是交给容器装配。
常见问题包括:
@Autowired按类型还是按名称匹配。- 一个接口多个实现时怎么选择。
@Qualifier和@Primary怎么用。- 循环依赖为什么有时能解决、有时不能。
- SPI 或扩展点如何接入容器。
依赖注入的核心不是少写几行 new,而是让对象协作关系可管理、可替换、可测试。
MVC 是请求到方法的映射
Spring MVC 关注 HTTP 请求如何进入 Controller。
可以按这条链路理解:
请求 -> DispatcherServlet -> HandlerMapping -> HandlerAdapter -> Controller -> 返回结果
其中 @RequestMapping、参数绑定、返回值处理、异常处理都在这条链路上。
还要注意 Controller 默认是单例。如果 Controller 里放可变成员变量,就可能引入线程安全问题。
事务是业务边界
@Transactional 看起来简单,但真正要注意的是边界:
- 哪些异常会触发回滚。
- 内部方法调用为什么可能不生效。
- 事务传播行为如何影响嵌套调用。
- 事务提交后回调适合放什么逻辑。
- 数据库事务和消息发送如何协调。
事务不是给所有方法都加注解,而是要围绕业务一致性边界来设计。
AOP 是横切能力
AOP 适合处理日志、监控、鉴权、事务、缓存等横切逻辑。
理解 AOP 时重点看:
- JDK 动态代理和 CGLIB 的差异。
- 代理对象和目标对象的区别。
- 内部调用为什么绕过代理。
- 切点表达式如何匹配方法。
- javaagent 和 LTW 属于更底层的增强方式。
很多 Spring 事务问题,本质上也是代理问题。
启动机制把所有东西装起来
Spring Boot 的启动机制负责把配置、自动装配、内嵌容器和应用入口串起来。
学习时可以看:
SpringApplication.run做了什么。- 自动配置如何生效。
- 配置属性如何绑定。
- fat jar 如何启动。
- 启动钩子适合做哪些初始化。
把启动机制看懂后,很多“为什么这个 Bean 会存在”“为什么这个配置生效”的问题都会更清楚。
学习顺序建议
可以按这个顺序学:
- 容器和 Bean 生命周期。
- 依赖注入和多实现选择。
- MVC 请求链路。
- 事务边界和代理问题。
- AOP 动态代理。
- Spring Boot 启动和自动配置。
Spring 的核心不是某个注解,而是容器、代理和请求链路共同组成的一套运行模型。把模型串起来,零散知识点才会变得有方向。




