當前位置:
首頁 > 最新 > Spring Framework 5.x 中的新特性

Spring Framework 5.x 中的新特性

Spring Framework 5.0 中的新功能和增強

JDK 8+ 和 Java EE 7+ 基準版

基於 Java 8 源代碼級別的完整框架代碼

通過引入泛型、lambda 等提高可讀性。

通過直接代碼支持 Java 8 功能的條件支持。

方便開發和部署的目的,完全兼容 JDK 9。

在 classpath 和模塊路徑上(支持穩定自動模塊名)。

框架構建和測試組件在 JDK 9 上也支持 (默認情況運行在 JDK 8 之上)。

目前 Spring 相關功能需要 Java EE 7 API 級。

Servlet 3.1, Bean Validation 1.1, JPA 2.1, JMS 2.0

近期的伺服器: 例如 Tomcat 8.5+, Jetty 9.4+, WildFly 10+

運行時兼容 Java EE 8 API 級。

Servlet 4.0, Bean Validation 2.0, JPA 2.2, JSON Binding API 1.0

在 Tomcat 9.0, Hibernate Validator 6.0, Apache Johnzon 1.1 已測試

已移除的包、類和方法

不再支持 AnnotationDrivenStaticEntityMockingControl。

最低要求: Tiles 3 和 Hibernate 5。

不再支持的部分: Portlet, Velocity, JasperReports, XMLBeans, JDO, Guava。

推薦:如果需要維持現有的 Spring Framework 4.3.x。

在代碼庫中移除諸多遺棄的類和方法。

在生態系統中對於常用的方法作了少數折中。

通用核心修訂

JDK 8+ 增強:

基於 Java 8 反射增強的高效方法參數訪問。

核心 Spring 介面中 Java 8 默認方法的選擇性聲明。

使用 JDK 7 Charset 和 StandardCharsets 增強功能。

JDK 9 兼容性:

儘可能避免 JDK 9 中不推薦使用的 JDK API。

通過構造函數實現一致性實例化(修改異常處理)。

避免將反射機制應用在核心的 JDK 類上

包級別的非空 API 聲明:

使用 @Nullable 顯式注釋的可空參數,欄位和返回值。

主要用於 IntelliJ IDEA 和 Kotlin,還有 Eclipse 和 FindBugs。

一些 Spring API 不再容許空值(例如 StringUtils)。

Resource 為防禦性 getFile 訪問提供 isFile 指示。

Resource 介面中還包含基於 NIO 的可讀通道訪問器。

通過 NIO.2 流文件系統訪問(不再使用 FileInput / OutputStream)。

Spring Framework 5.0 自帶的 Commons Logging bridge 開箱即用:

spring-jcl 替代標準的 Commons Logging;仍然可排除/可覆蓋。

自動檢測 Log4j 2.x,SLF4J,JUL(java.util.logging),而無需額外的橋接。

spring-core 隨附 ASM 6.0(計 CGLIB 3.2.5 和 Objenesis 2.6 之後)。

核心容器

支持任意 @Nullable 注釋作為標識符,用於作為可選注入點。

在 GenericApplicationContext/AnnotationConfigApplicationContext 上支持函數式風格

使用 bean 定義的可定製回調的基於 Supplier 的 bean 註冊 API。

在介面方法上持續監測 transaction, caching, async 注釋。

在 CGLIB 代理的情況下。

簡化的無版本化 schema 的 XML 配置命名空間 。

總是解析最新的 xsd 文件;不支持遺棄的功能。

版本相關聲明依然支持,但需要使用最新的 schema 驗證。

支持候選組件索引(作為 classpath 掃描的替代項)。

Spring Web MVC

在 Spring 提供的 Filter 實現中完全全支持 Servlet 3.1 特性。

在 Spring MVC 控制器方面中支持 Servlet 4.0 的 PushBuilder 參數。

在常見伺服器上支持 Servlet 3.0 的 MaxUploadSizeExceededException 解析 multipart。

通過 MediaTypeFactory 委託統一支持常見媒體類型。

取代 Java Activation Framework。

使用不可變對象進行數組綁定 (Kotlin / Lombok / @ConstructorProperties)

支持綁定 JSON 的 API(代替 Jackson 和 GSON)。

支持 Jackson 2.9。

支持 Protobuf 3。

為了在 Spring MVC 控制器中使用新的響應式 WebClient(見下面)或者 Spring Data Reactive 庫,Spring MVC 控制器方法允許返回 Reactor 3.1 Flux 和 Mono,以及 RxJava 1.3 和 2.1。

新的 ParsingPathMatcher 代替 AntPathMatcher,帶來更高效的解析和擴展語法。

@ExceptionHandler 方法允許 RedirectAttributes 參數(還有快速屬性)。

支持 ResponseStatusException 代替 @ResponseStatus。

通過直接使用 ScriptEngine#eval(String, Bindings) 渲染腳本來支持未實現 Invocable 的腳本引擎,還通過 RenderingContext 參數支持國際化(i18n)和 ScriptTemplateView 的嵌入模板。

Spring 的 FreeMarker 宏 (spring.ftl) 現在使用 HTML 作為輸出格式(需要 FreeMarker 2.3.24+)。

Spring WebFlux

新的spring-webflux模塊基於非同步、非阻塞的響應式編程,用來代替 spring-webmvc。與傳統的每個請求使用巨大線程池中一個線程的模式不同,響應式編程採用事件循環執行的模型。

spring-core 中的響應式基建包括 Encoder 和 Decoder 用於對對象流進行編碼和解碼;DataBuffer 抽象,比如 Java 的 ByteBuffer 或 Netty 的 ByteBuf;控制器方法簽名中的 ReactiveAdapterRegistry 支持響應庫。

spring-web 中的響應式基建包括 HttpMessageReader 和 HttpMessageWriter,它們基於 Encoder 和 Decoder 創建,並成為其代表;伺服器 HttpHandler 適配像 Servlet 3.1+ 容器、Netty 和 Undertow 這樣的(非阻塞)運行時;WebFilter、WebHandler 和其它非阻塞協議作為 Servlet API 的等價替代品。

@Controller 風格,基於註解的編程模式,與 SprintMVC 相似,但受到 WebFlux 支持,運行於響應棧,比如,它可以支持的響應類型包括控制器方法參數,不阻塞 I/O,關注到 HTTP 套接字的全路徑背壓,運行在額外的非 Servlet 容器,比如 Netty 和 Undertow。

新的函數式編程模型(「WebFlux.fn」)可代替 @Controller,基於註解的編程模型——最小而且透明的終端路由 API,運行於相同的響應棧和 WebFlux 架構。

新的 WebClient 支持在調用 HTTP 時使用函數式編程和響應式 API,能與通過 Fluent API 實現的 RestTemplate 媲美,還擅長基於 WebFlux 架構的非阻塞和流模式;5.0 中已經不推薦使用 AsyncRestTemplte 而應該使用 WebClient。

Kotlin 支持

使用 Kotlin 1.1.50+ 時的 Nul l安全性 API

支持具有可選參數和默認值的 Kotlin 不可變類

函數 bean 定義 Kotlin DSL。

為 WebFlux 函數路由Kotlin DSL。

利用Kotlin引用的類型參數,以避免在各種API(如RestTemplate或WebFlux API)中明確指定用於序列化/反序列化的類。

Kotlin Null 安全支持對於 @Autowired/@Inject 和 @RequestParam/@RequestHeader/etc 的注釋,用來確定是否需要一個參數/ bean。

Kotlin 腳本在 ScriptTemplateView 中得到 Spring MVC 和 Spring WebFlux 的支持

類似 Array 的 setter 添加到 Model,ModelMap 和 Environement 中。

支持可選參數的 Kotlin 自動裝配構造函數

Kotlin反射用於確定介面方法參數

測試提升

在 Spring TestContext 框架中完全支持JUnit 5的 Jupiter 編程及其擴展模型

SpringExtension: 來自 JUnit 的多個擴展 API 的實現,它提供了 Spring TestContext 框架中現有功能集的全部支持。這些支持是通過 @ExtendWith(SpringExtension.class 使能的。

@SpringJUnitConfig: 整合來自 JUnit Jupiter 的 @ExtendWith(SpringExtension.class) 與 Spring TestContext 框架的@ContextConfiguration 的複合註解。

@SpringJUnitWebConfig: 整合來自 JUnit Jupiter 中的 @ExtendWith(SpringExtension.class) 與來自 Spring TestContext 框架的 @ContextConfiguration 和 @WebAppConfiguration 的複合註解。

@EnabledIf: 表示被註解的測試類或測試方法在以下條件是使能的:補充 SpEL 表達式或屬性佔位符被設置為 true。

@DisabledIf: 表示被註解的測試類或測試方法在以下條件是禁用的:補充 SpEL 表達式或屬性佔位符被設置為 true。

支持 Spring TestContext 框架總的並行測試執行。

Spring TestContext 框架中新版的 before 和 after 測試執行回調通過 SpringRunner(注意不是通過 JUnit 4 規則)支持 TestNG、JUnit 5 以及 JUnit 4。

在 TestExecutionListener API 和 TestContextManager 中新添加 beforeTestExecution() 和 afterTestExecution() 回調。

MockHttpServletRequest 現在有 getContentAsByteArray() 和 getContentAsString() 方法,可用於訪問其內容(例如,請求主體)。

如果字符集編碼格式已經在 mock 請求中設置,則 Spring MVC 測試中的 print() 和 log() 方法現在將列印請求主體。

Spring MVC 測試中的 redirectedUrl() 和 forwardedUrl() 方法現在支持 URI 模板,並支持變數擴展。

XMLUnit 支持升級到 2.3 版本。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 開源中國 的精彩文章:

提高代碼可讀性的 10 個技巧
Facebook 是如何進行大規模代碼部署的
src2png——將代碼生成美觀的圖片
不要浪費時間寫完美代碼
蘋果開源 iOS 內核啦!全球資料庫排名 MySQL 三連跌

TAG:開源中國 |