Spring 不是一个框架,是一个生态帝国。它解决的核心问题只有两个:对象谁来造(IoC/DI)和横切逻辑怎么抽(AOP)。把这两件事搞明白,你就拿到了 Java 后端世界的入场券。这一页用银行转账的例子,带你从"new 一个 UserService"一路写到"事务回滚"。
版最新版本与兼容性:先搞清楚你用的是哪一代
Spring Framework 现在是"双轨并行":6.x 是现役主力,5.3.x 是存量维护版。写代码之前第一件事,就是确认你手上的项目跑在哪一代——因为 javax.* 和 jakarta.* 的包名不兼容,把 Spring 5 的代码直接搬到 Spring 6 上,启动就炸。
| 版本线 | JDK 基线 | 命名空间 | 现状 |
|---|---|---|---|
| 6.2.x | 17+(推荐 21) | jakarta.* | 最新稳定线,持续跟进新特性;具体补丁号以官网最新稳定版为准。 |
| 6.1.x | 17+(推荐 21) | jakarta.* | 本教程基线,当前广泛使用的稳定版,Spring Boot 3.2–3.5 默认绑定它。 |
| 5.3.x | 8+ | javax.* | 上一代,进入维护末期;Spring Boot 2.x 全家桶都跑在它上面,存量项目极多。 |
① JDK 17 起步:Spring 6 直接砍掉了 JDK 8/11 支持,编译期就用了 17 的语法(record、switch 模式匹配)。
② 全面 Jakarta EE 9+:所有 javax.servlet / javax.persistence / javax.validation 统统改名为 jakarta.*。这是 Jakarta EE 9 的硬性变化,不是 Spring 自己瞎改。
③ 删了一批过时 API:老版本里标了 @Deprecated 的东西在 6.0 里直接删库跑路,别再 import。
兼容矩阵:Framework ↔ Boot ↔ JDK
| Spring Framework | Spring Boot | JDK | 命名空间 |
|---|---|---|---|
| 6.2.x | 3.5.x(含 3.4.x 部分) | 17+(推荐 21) | jakarta.* |
| 6.1.x | 3.2.x – 3.4.x | 17+(推荐 21) | jakarta.* |
| 6.0.x | 3.0.x – 3.1.x | 17+ | jakarta.* |
| 5.3.x | 2.3.x – 2.7.x | 8+ | javax.* |
一句话记住:Boot 2.x 配 Framework 5.3 + JDK 8 + javax;Boot 3.x 配 Framework 6.x + JDK 17 + jakarta。跨代升级别一股脑全升,顺序是——先升 JDK、再改包名 javax→jakarta、最后升 Boot,出了问题才知道是谁的锅。
- Spring 是什么:一个生态帝国的自我介绍
- IoC 与 DI:对象不用自己 new,Spring 给你递过来
- Bean 的生命周期:从出生到销毁的一生
- AOP:把日志、事务、安全从业务代码里抠出来
- 事务管理:银行转账不能转一半就跑
- 资源、环境与配置:多环境切换的正确姿势
- Spring 事件机制:对象之间别直接喊,发广播
- Spring 测试:怎么验证你的 Bean 没画错
- 小项目:银行转账系统(事务回滚实战)
- 常见坑:循环依赖、事务失效、AOP 不生效
- Spring Security 核心:一条过滤器链管住所有请求
- OAuth2 / OIDC / JWT 实战:把"第三方登录"讲成一条能跑的链路
- 缓存抽象 @Cacheable 与 Redis 集成:让重复查询不必重复算
- WebSocket / STOMP 与 Actuator + springdoc:把服务推出去、把状态看出来
第 1 节 · Spring 是什么:生态帝国的自我介绍
2003 年,Rod Johnson 嫌 EJB 太臃肿,自己写了一本《Expert One-on-One J2EE D
第 2 节 · IoC 与 DI:对象不用自己 new
传统写法里,UserService 自己 new UserDao(),把对象的创建权攥在自己手里。问题是:UserSer
第 3 节 · Bean 的生命周期:从出生到销毁
Spring 容器启动时,Bean 不是"new 完就完事",它要走一整套流程:实例化 → 属性注入 → 初始化 → 就
第 4 节 · AOP:把横切逻辑从业务代码里抠出来
假设你有 100 个 Service 方法,每个方法都要打日志、算耗时、开事务、检查权限。如果把这些代码写进每个方法里,
第 5 节 · 事务管理:银行转账不能转一半
转账这个动作,本质是两条 SQL:A 扣款、B 加钱。如果 A 扣完钱、B 还没加钱时服务器宕机,钱就凭空消失了。事务的
第 6 节 · 资源、环境与配置:多环境切换的正确姿势
开发、测试、生产三套环境,数据库地址不一样、开关不一样、日志级别不一样。你不能靠"上线前手动改配置文件"过日子——那是事
第 7 节 · Spring 事件机制:对象之间别直接喊
用户注册成功后,你要发邮件、发短信、写积分、加新人引导……如果 UserService 里依次调用 EmailServi
第 8 节 · Spring 测试:怎么验证 Bean 没画错
脱离容器测试 Bean,就是 new 一个对象、手动 set 依赖——跟 Spring 没关系,等于白用。Spring
第 9 节 · 小项目:银行转账系统
把前面学的 IoC、AOP、事务、配置类串起来,写一个能跑的最小银行转账系统。重点看三件事:① 用构造器注入组装 Bea
第 10 节 · 常见坑与最佳实践
Common Pitfalls & Best Practices
第 11 节 · Spring Security 核心:一条过滤器链管
前面十章讲的是"怎么把功能写出来",这一章开始讲"怎么保证只有该来的人才能用"。Spring Security 是 Sp
第 12 节 · OAuth2 / OIDC / JWT 实战:把"第
上一章讲了 Spring Security 的骨架,但真实项目里的认证往往不是"表单登录",而是"用户从企业微信/钉钉/
第 13 节 · 缓存抽象 @Cacheable 与 Redis 集成
一个接口第一次要 800 毫秒,加缓存后 3 毫秒——这是后端最立竿见影的优化。但缓存也是"引入 bug 最快"的技术:
第 14 节 · WebSocket / STOMP 与 Actuat
前面十三章讲的都是"客户端来问、服务端来答"。这一章要解决两个新问题:服务端怎么主动把消息推给客户端(WebSocket