Spring 6.0 变更 | Spring boot 3.0 抢先了解
一、核心变动
基于 JSR-330 的 @Inject
注释现在可以在 jakarta.inject
包找到。基于 JSR-250 的注释 @PostConstruct
和 @PreDestroy
可以在 jakarta.annotation
中找到。目前,Spring 还会检测 javax
包下的这些注解,包括预编译二进制文件中的常见用法。
ListenableFuture
已被弃用, CompletableFuture
已经完全取代它。详见 27780。
二、数据和事务
由于Jakarta EE 的迁移,请确保升级到 Hibernate ORM 5.6.x 并使用 hibernate-core-jakarta
组件,同时切换 imports 包javax.persistence
到 jakarta.persistence
。相应的Hibernate Validator 版本是 7.0.x,基于 jakarta.validation
。
三、Web 应用
由于Jakarta EE 的迁移,请确保升级到 Tomcat 10、Jetty 11 或 Undertow 2.2.14,并使用 undertow-servlet-jakarta
组件,同时切换 imports 包 javax.servlet
到 jakarta.servlet
。
一些基于过时的 Servlet 组件也已被弃用:例如 Commons FileUpload、Tiles,以及FreeMarker JSP 的支持。如果需要,我们建议使用内置的StandardServletMultipartResolver
进行文件上传和常规 FreeMarker 模板视图,并将重点放在面向 REST 的 web 架构上。
Spring MVC 和 Spring WebFlux 不再仅仅基于 @RequestMapping
注解来判定为控制器。这意味着基于接口的 AOP 代理可能不再适用于 web 控制器。请为此类控制器启用基于类的代理,否则接口也必须添加 @Controller
注解,详见 22154。
HttpMethod
改为了类,不再是枚举。虽然维护了 public API,但可能需要进行一些迁移(例如:EnumSet<HttpMethod>
更改为 Set<HttpMethod>
,使用 if-else
而不是 switch
)。关于这一决定背后的讨论,详见 27697。
Kotlin 的扩展函数 WebTestClient.ResponseSpec::expectBody
现在返回的是 BodySpec
类型不再是 KotlinBodySpec
。Spring6.0 使用了 Kotlin1.6,它修复了此方案的 bug(KT-5464)。这也意味着 consumeWith
不再可用。
RestTemplate 或者说 HttpComponentsClientHttpRequestFactory
,现在需要 Apache HttpClient 5。