Spring Framework 7与Spring Boot 4技术发布:API版本控制与JDK 25支持
来源: InfoQ - 后端
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进行配置,并在映射上直接声明版本,例如:
@GetMapping(url = "/accounts/{id}", version = "1.1"它们还具备符合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