Spring Boot 4.0 新特性全解析(基于 Spring Framework 7)
Spring Boot 4.0 新特性全解析(基于 Spring Framework 7)
📅 更新时间:2026 年 · 预计阅读时间:15 分钟 · 适用版本:Spring Boot 4.x
Spring Boot 4.0 是自 2.x 以来改动最激进的一个大版本。它不只是版本号跳跃,而是从底层框架、自动配置模型到默认技术栈的全面重构。这篇文章把散落在官方文档和发布说明中的关键变化,整理成一份可以直接照着升级的清单。
一、基线要求:先看门槛
| 项目 | Spring Boot 3.x | Spring Boot 4.0 |
|---|---|---|
| 最低 Java 版本 | Java 17 | Java 17 |
| 推荐 Java 版本 | Java 21 | Java 25 LTS |
| 底层规范 | Jakarta EE 10 | Jakarta EE 11 |
| Servlet 容器 | Tomcat 10 / Jetty 11 / Undertow | Tomcat 11 / Jetty 12 |
| Spring Framework | 6.x | 7.x |
⚠️ 注意:Undertow 嵌入式容器已被移除,原因是 Undertow 不支持 Servlet 6.1 基线,只能在 Tomcat 和 Jetty 之间二选一。
二、架构重大革新:自动配置完全模块化
这是 Boot 4 最重要的架构改动,也是升级时最需要关注的一点。
Boot 3 的问题
所有组件的自动配置都塞在一个巨大的 spring-boot-autoconfigure 包里。不管你项目里有没有引入 JPA、Redis、Kafka,这些自动配置类都会被扫描和加载。
Boot 4 的做法
拆分为独立小模块,Web、JPA、Redis、Kafka 各自拥有独立的 autoconfigure 包,按需加载。
带来的收益:
- 启动时扫描的类显著减少,启动更快
- GraalVM Native 镜像体积大幅缩小
- IDE 中配置属性提示更干净,不再出现大量无关配置
平滑迁移
官方提供 -classic 系列 starter,模拟 Boot 3 的大包行为,老项目可以先切过去过渡。
📌 如果你维护的是自定义自动配置项目,需要同步修改
META-INF下的配置文件。💡
-classicstarter 是过渡方案,内部还是旧的大包 autoconfigure,不推荐长期使用。迁移完成后应尽快替换为模块化 autoconfigure。
三、空安全标准化:全面拥抱 JSpecify
整个 Spring 套件统一改用 JSpecify 空安全注解,替代旧的 JSR-305。
- Java 编译期即可做空值检查,减少 NPE
- 与 Kotlin 空安全互操作性更好
- 框架 API 全部明确标记可空 / 不可空
四、JSON 层:默认切到 Jackson 3
默认的 spring-boot-starter-json 已经使用 Jackson 3,最直观的变化是包名变更:
com.fasterxml.jackson → tools.jackson
⚠️ 注意:
jackson-annotations模块(如@JsonView、@JsonTypeInfo、@JsonProperty)为了兼容,仍然保留com.fasterxml.jackson.annotation包名,不会迁移到tools.jackson。如果全量替换包名,这些注解的 import 会报错。
| 变化点 | 说明 |
|---|---|
| 默认 JSON 库 | Jackson 3 |
| 包名 | com.fasterxml.jackson → tools.jackson(jackson-annotations 除外) |
| Jackson 2 状态 | 已标记废弃,提供过渡兼容模块,未来版本彻底移除 |
| 自动配置 Bean | ObjectMapper → JsonMapper |
| 兼容开关 | spring.jackson.use-jackson2-defaults |
💡 升级时如果序列化行为不一致,可以先打开
spring.jackson.use-jackson2-defaults临时兼容旧行为,再逐个排查差异。
五、Web 层新能力
1. 原生 API 版本控制(MVC / WebFlux)
不再需要第三方版本管理组件,框架内置接口版本能力,支持请求头、请求参数、媒体类型三种解析方式。
开启配置:
spring.mvc.apiversion.enabled=true
spring.mvc.apiversion.default-version=1
代码中使用(注意:注解属性是 version,不是 apiVersion):
@RestController
@RequestMapping("/api")
public class OrderController {
@GetMapping(value = "/order", version = "1")
public String v1() {
return "v1";
}
@GetMapping(value = "/order", version = "2")
public String v2() {
return "v2";
}
}
2. HTTP Service Client(声明式 HTTP 客户端)
这是官方替代 Feign 的方案,基于 Java 内置 HTTP 客户端 / RestClient / WebClient 实现。写接口加注解,Spring 自动生成代理实现,开箱即可自动配置。
@HttpExchange("/user")
public interface UserApi {
@GetExchange("/{id}")
UserDTO getUser(@PathVariable Long id);
}
直接注入使用,无需额外引入 Feign 依赖。底层依赖 Java 11+ 的内置 HttpClient(Boot 4.0 基线为 Java 17,天然满足)。
3. RestTemplate 标记废弃
- 不再自动装配
- 官方推荐迁移到 RestClient
- 测试场景提供 RestTestClient
- 如果项目仍要使用 RestTemplate,需要手动创建 RestTemplate Bean
六、框架内置弹性容错能力
重试和并发限制直接进入 spring-core,不再需要引入 spring-retry 依赖。
⚠️ 重要:
@Retryable和@ConcurrencyLimit默认不生效,必须在配置类上添加@EnableResilientMethods才会开启韧性方法处理。不添加该注解,弹性注解完全不工作。
// 需要在配置类添加 @EnableResilientMethods 才会生效
@Configuration
@EnableResilientMethods
public class ResilienceConfig {
// ...
}
// 重试
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000))
public List<Order> queryOrder() {
// ...
}
// 并发数限制:控制同一时刻该方法允许的并发执行线程数
@ConcurrencyLimit(limit = 20)
public void handleBiz() {
// ...
}
🎯
@ConcurrencyLimit限制的是方法并发调用数量,类似线程池/连接池的池大小限制,达到上限后会阻塞后续调用,不是 QPS 限流。对于大多数项目,现在可以去掉spring-retry+ AOP 的额外配置,直接用框架注解。
七、可观测性:全新 OpenTelemetry Starter
新增 spring-boot-starter-opentelemetry,提供一套一体化的 OTel 可观测方案,一键对接 OTLP 协议,可以替代传统 Micrometer + Zipkin 的复杂组合。
📌 链路和指标开箱可用,日志采集需要额外配置 Logback appender,并非完全零配置。
💡 注意:该 starter 内部仍然使用 Micrometer 来导出 traces 和 metrics,只是通过 OTLP 协议统一输出,配置属性遵循
management.*前缀。它并不是"移除 Micrometer",而是提供了一套更简洁的替代方案。
八、Kotlin 升级到 2.2(K2 编译器)
- 启用 K2 编译器,编译速度明显提升
- 协程上下文自动传播,链路追踪在
suspend挂起函数中正常生效 - 提供专用的
kotlinx-serialization-jsonstarter
九、测试体系升级
| 变化 | 说明 |
|---|---|
| JUnit 6 | spring-boot-starter-test 默认引入 JUnit 6;其编程模型(Jupiter API)与 JUnit 5 基本兼容,存量测试代码升级成本很低;JUnit 4 测试仍可通过 Vintage Engine 兼容运行,并非直接删除 |
@SpringBootTest | 不再默认提供 MockMvc、TestRestTemplate,需手动加 @AutoConfigureMockMvc |
| 测试上下文 | 自动暂停,降低多测试类切换时的内存占用 |
| RestTestClient | 普通 Java 测试场景替代 WebTestClient |
十、重点移除与默认行为变更(升级踩坑清单)
🚨 这一节是升级前必读内容,请逐条核对你的项目。
| 类别 | 变更内容 |
|---|---|
| 容器 | ❌ 移除 Undertow 嵌入式容器,只能选 Tomcat / Jetty |
| Security | ❌ 删除 Boot 3 全部标记废弃的 API:WebSecurityConfigurerAdapter、authorizeRequests() |
| Security | Spring Security 7:基于 session-cookie 的 REST 接口 CSRF 默认开启;JWT 等无状态 token 场景本身不会触发 CSRF 防护,基于 Cookie 会话的无状态接口需要手动关闭 CSRF |
| 配置绑定 | @ConfigurationProperties 不再支持直接绑定 public 字段,推荐使用 setter 或构造器绑定(constructor binding) |
| HTTP 客户端 | RestTemplate 自动配置移除,需手动创建 RestTemplate Bean |
| XML | 不再支持 XML 命名空间配置,统一推荐 JavaConfig |
十一、Spring Boot 4.1 追加新特性
后续小版本继续加码,值得关注的有:
- 原生 Spring gRPC 支持
- HTTP 客户端 SSRF 防护:
InetAddressFilter - Log4j 文件滚动增强
- OTel 语义约定进一步完善
小结
Spring Boot 4.0 的核心可以概括为三句话:
- 架构上——自动配置模块化,启动更快、镜像更小
- 能力上——API 版本控制、声明式 HTTP 客户端、弹性容错、OTel 全部内置
- 迁移上——废弃 API 集中清理,Jackson 3 包名变更、Security 默认行为和
@EnableResilientMethods是最大的几个坑
✅ 建议升级路径:先升到 Boot 3 最新版 → 清理所有
@DeprecatedAPI → 切换到-classicstarter 过渡 → 再升 Boot 4 → 最后按模块拆除 classic 包。
如果这篇文章对你有帮助,欢迎点赞收藏 ⭐

浙公网安备 33010602011771号