Spring 6.0 變更 | Spring boot 3.0 搶先了解
一、核心變動
基于 JSR-330 的 @Inject 注釋現(xiàn)在可以在 jakarta.inject 包找到。基于 JSR-250 的注釋 @PostConstruct 和 @PreDestroy 可以在 jakarta.annotation 中找到。目前,Spring 還會檢測 javax 包下的這些注解,包括預(yù)編譯二進(jìn)制文件中的常見用法。
ListenableFuture 已被棄用, CompletableFuture 已經(jīng)完全取代它。詳見 27780。
二、數(shù)據(jù)和事務(wù)
由于Jakarta EE 的遷移,請確保升級到 Hibernate ORM 5.6.x 并使用 hibernate-core-jakarta 組件,同時切換 imports 包javax.persistence 到 jakarta.persistence。相應(yīng)的Hibernate Validator 版本是 7.0.x,基于 jakarta.validation。
三、Web 應(yīng)用
由于Jakarta EE 的遷移,請確保升級到 Tomcat 10、Jetty 11 或 Undertow 2.2.14,并使用 undertow-servlet-jakarta 組件,同時切換 imports 包 javax.servlet 到 jakarta.servlet。
一些基于過時的 Servlet 組件也已被棄用:例如 Commons FileUpload、Tiles,以及FreeMarker JSP 的支持。如果需要,我們建議使用內(nèi)置的StandardServletMultipartResolver 進(jìn)行文件上傳和常規(guī) FreeMarker 模板視圖,并將重點放在面向 REST 的 web 架構(gòu)上。
Spring MVC 和 Spring WebFlux 不再僅僅基于 @RequestMapping 注解來判定為控制器。這意味著基于接口的 AOP 代理可能不再適用于 web 控制器。請為此類控制器啟用基于類的代理,否則接口也必須添加 @Controller 注解,詳見 22154。
HttpMethod 改為了類,不再是枚舉。雖然維護(hù)了 public API,但可能需要進(jìn)行一些遷移(例如:EnumSet<HttpMethod> 更改為 Set<HttpMethod> ,使用 if-else 而不是 switch)。關(guān)于這一決定背后的討論,詳見 27697。
Kotlin 的擴(kuò)展函數(shù) WebTestClient.ResponseSpec::expectBody 現(xiàn)在返回的是 BodySpec 類型不再是 KotlinBodySpec。Spring6.0 使用了 Kotlin1.6,它修復(fù)了此方案的 bug(KT-5464)。這也意味著 consumeWith 不再可用。
RestTemplate 或者說 HttpComponentsClientHttpRequestFactory,現(xiàn)在需要 Apache HttpClient 5。
