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.xSpring Boot 4.0
最低 Java 版本Java 17Java 17
推荐 Java 版本Java 21Java 25 LTS
底层规范Jakarta EE 10Jakarta EE 11
Servlet 容器Tomcat 10 / Jetty 11 / UndertowTomcat 11 / Jetty 12
Spring Framework6.x7.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 下的配置文件。

💡 -classic starter 是过渡方案,内部还是旧的大包 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 状态已标记废弃,提供过渡兼容模块,未来版本彻底移除
自动配置 BeanObjectMapper → 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-json starter

九、测试体系升级

变化说明
JUnit 6spring-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()
SecuritySpring 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 的核心可以概括为三句话:

  1. 架构上——自动配置模块化,启动更快、镜像更小
  2. 能力上——API 版本控制、声明式 HTTP 客户端、弹性容错、OTel 全部内置
  3. 迁移上——废弃 API 集中清理,Jackson 3 包名变更、Security 默认行为和 @EnableResilientMethods 是最大的几个坑

✅ 建议升级路径:先升到 Boot 3 最新版 → 清理所有 @Deprecated API → 切换到 -classic starter 过渡 → 再升 Boot 4 → 最后按模块拆除 classic 包。

如果这篇文章对你有帮助,欢迎点赞收藏 ⭐

posted @ 2026-10-12 01:04  春秋蝉带我回暑假  阅读(19)  评论(0)    收藏  举报