
Broadcom 在 2025 年 11 月发布了Spring Framework 7.0(参见版本发布的博客文章)和Spring Boot 4.0(参加版本发布的博客文章)。新一代的版本推出了一流的 REST API 版本控制、基于 JSpecify 注解实现 Spring 产品组合中标准化的空值安全、内置的韧性功能(如重试和并发限制)。Spring Boot 4 迁移到了 Jackson 3 进行 JSON 处理,并将单体的自动化配置 JAR 拆分成了多个模块。Spring Framework 7 保持 JDK 17 作为基线,同时支持JDK 25,同时采用 Jakarta EE 11 和 Kotlin 2.2 作为新的基线。
现在,新的API版本控制功能在 Spring MVC 和 Spring WebFlux 中均已可用。框架支持基于路径、头信息、查询参数和媒体类型的版本控制策略。控制器通过ApiVersionStrategy进行配置,并在映射上直接声明版本,例如:
它们还具备符合 RFC 9745 规范的内置弃用处理功能。RestClient、WebClient和 HTTP 接口客户端使用了 ApiVersionInserter,非反应式的RestTestClient(7.0 中新加入)和WebTestClient也是如此。ApiVersionStrategy和ApiVersionInserter都是 Spring Framework 的一部分,可供所有在 Spring 上运行的库和应用程序使用。
Spring Framework 7 完成了向标准化JSpecify注解的迁移,以实现 Spring 产品组合中的空值安全性。JSpecify联盟包括 OpenJDK、Broadcom、Google、JetBrains 和 Sonar。@Nullable和@NonNull注解适用于标准和泛型类型、数组和可变参数元素。Kotlin 2 会自动将 JSpecify 注解转换为 Kotlin 的 nullability。IntelliJ IDEA 2025.3 通过全面覆盖提供了一流的支持,包括复杂的数据流分析。NullAway项目的构建期检查至少需要 JDK 21,不过对 JDK 17 的支持可能会提供。
Spring Retry中的韧性特性已经转移到了 Spring Framework 7 中。@Retryable注解提供了声明式重试支持,它能自动适应反应式方法、指数退避(back-off)和抖动。@ConcurrencyLimit注解启用了声明式并发控制,特别是与虚拟线程一起使用时非常有价值。
Jackson 3 主要的破坏性变更是包的迁移,从 com.fasterxml.jackson 迁移到了 tools.jackson。现在推荐的 JSON 映射器是JsonMapper,它取代了ObjectMapper并提供了不可变性和特定格式的映射器。默认的序列化行为变更将MapperFeature.SORT_PROPERTIES_ALPHABETICALLY设置为true,DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS设置为false,这将日期序列化为 ISO-8601 字符串。应用程序仍然可以使用已弃用的 Jackson 2,甚至可以同时使用 Jackson 2 和 3。
Spring Boot 4 将自动化配置进行了模块化:增加了许多特定技术的模块,如spring-boot-starter-webmvc和spring-boot-starter-webmvc-test,取代了原来的两个单体spring-boot-autoconfigure和spring-boot-test-autoconfigure JAR。这减少了应用程序占用的空间,并防止 IDE 自动完成建议未使用的类或配置属性。
新版本保持了原有的 JDK 17 基线,正如 Spring Framework 项目负责人Juergen Hoeller在 2024 年 11 月告诉InfoQ的那样,这是因为“当前的行业共识显然是围绕 Java 17 基线的”。但 Spring 拥抱了 JDK 25 及其所有的特性。Jakarta EE 基线从版本 9 升级到了版本11。这带来了 Jakarta Servlet 6.1、Jakarta WebSocket 2.2、Jakarta Validation 3.1 和 Jakarta Persistence 3.2。它还提供了对 Hibernate ORM 7.1 的支持,该版本不再允许分离的实体重新与持久化上下文关联。Spring Boot 4 目前不支持 Undertow Web 服务器,因为它与 Jakarta Servlet 6.1 还不兼容。
新的HTTP接口组(HTTP Interface Groups)允许应用程序一次配置多个 HTTP 接口客户端,并让它们共享同一个RestClient。Spring Framework 7.1(预计在 2026 年 11 月)将弃用RestTemplate类,转而支持RestClient接口,而 Spring Framework 8(日期待定)将移除RestTemplate。HTTP服务客户端(HTTP Service Client)的增强包括新的HttpServiceProxyRegistry接口(作为HttpServiceProxyFactory类之上新的一层),以及使用HttpServiceGroupConfigurer bean 方法为 HTTP 服务组配置 HTTP 客户端的能力。HttpStatus类现在包含了新的HTTP状态代码。
其他改进包括:Spring Boot 4 支持 Gradle 9;Spring Security 7支持了多要素认证;Kotlin Serialization 的改进,包括一个新的spring-boot-kotlin-serialization模块和相应的spring-boot-kotlin-serialization-starter;提供了一个流畅的JmsClient;Spring for Apache Kafka 4.0 为 Kafka 队列增加了Share Consumer支持,这可以在一个组中的多个消费者之间分配记录,而传统上每个分区属于单个消费者;任务调度/执行自动配置支持多个TaskDecorator bean;基于AntPathMatcher进行 HTTP 映射被弃用,请使用PathPattern;Spring Boot 3.x 中弃用的类、方法和属性被移除;不再支持javax.annotation和javax.inject包中定义的注解,需要将它们替换为与它们作用相同的jakarta.annotation和jakarta.inject注解。
进一步的改进还包括:应用程序上下文在不使用时现在会暂停,这在大型测试套件中会节省内存;Spring Framework 7 切换到了 GraalVM Native Image 的单文件可达性元数据格式;Spring Data 在构建时编译符合条件的仓库查询,以实现更快的启动;MongoDB 健康指标不再需要 Spring Data MongoDB;新的spring-boot-starter-opentelemetry包含了 OTLP 指标和追踪导出的所有依赖项;SSL 健康响应中新增的expiringChains条目会显示通过management.health.ssl.certificate-validity-warning-threshold属性配置的阈值内到期的证书链,这样的证书链会包含一个或多个证书。
值得注意的第三方依赖项升级包括 Kotlin 2.2.20、Tomcat 11.0、Jetty 12.1、GraphQL 24、Kafka 4.1.0、Elasticsearch Client 9.1、Hibernate Validator 9.0、Commons Lang3 3.19.0、Liquibase 5.0、Flyway 11.11、MongoDB 5.6.0、Mockito 5.20 和 TestContainers 2.0。
与 Spring Framework 7.0 和 Spring Boot 4.0 同步发布的版本包括Spring Cloud 2025.1.0、Spring for GraphQL 2.0、Spring Shell 4.0.0、Spring REST Docs 4.0、Spring Security 7.0、Spring Data 2025.1.1.0、Spring Session 4.0.0、Spring Integration 7.0、Spring Batch 6.0、Spring AMQP 4.0、Spring for Apache Kafka 4.0、 Spring for Apache Pulsar 2.0、Spring Web Services 5.0、Spring Vault 4.0和Spring Modulith 2.0。
Spring Boot 4迁移指南能够帮助开发人员迁移到新版本。最后一个Spring Boot 3版本,即 Spring Boot 3.5,将获得免费版本直到 2026 年 6 月,付费版本直到 2032 年 6 月。更多详细信息可以在 Spring Framework 7和Spring Boot 4的完整发布说明中找到。
查看英文原文: Spring Framework 7 and Spring Boot 4 Deliver API Versioning, Resilience, and Null-Safe Annotations







评论