天天看點

大資料開發:Spring 5的新特性

Spring5 是一個重要的版本,距離SpringFramework4差不多四年。在此期間,大多數增強都是在 SpringBoot 項目中完成的。在本文中,我們将很快了解到Spring5發行版中的一些令人興奮的特性。

1. 基準更新

要建構和運作 Spring5 應用程式,你至少需要 J2EE7 和 JDK8。以前的 JDK 和 JavaEE 版本不再支援。 JavaEE7 包含:

Servlet 3.1

JMS 2.0

JPA 2.1

JAX-RS 2.0

Bean Validation 1.1

與 Java 基準類似,許多其他架構的基準也有變化。例如:

Hibernate 5

Jackson 2.6

EhCache 2.10

JUnit 5

Tiles 3

另外,請記下各種伺服器最低支援版本。

Tomcat 8.5+

Jetty 9.4+

WildFly 10+

Netty 4.1+

Undertow 1.4+

2. 相容 JDK9 運作時

Spring5 發行版與 JDK9 發行日期非常接近。目标是讓 Spring Framework5 在 JDK9 的 GA 之後正确運作。 Spring5 版本的候選版本已經在 classpath 和 modulepath 上支援 Java9 了。

GA版本中你可以期待良好的 JDK9 支援。

3. 使用 JDK8 特性

在 Spring4.3 之前,JDK基準版本是6。是以 Spring4 必須支援 Java6,7 和8,為了保持向後相容性, Spring 架構沒有适應 Java8 帶來的許多新特性,比如 lambda 表達式。

Spring5 的基準版本為8,是以它使用了 Java8 和9的許多新特性。例如:

Spring 接口中的預設方法

基于 Java8 反射增強的内部代碼改進

在架構代碼中使用函數式程式設計 - lambda表達式 和 stream流

4. 函數式web架構

除了響應式功能之外,Spring5 還提供了一個函數式Web架構。它提供了使用函數式程式設計風格來定義端點的特性。 該架構引入了兩個基本元件:HandlerFunction 和 RouterFunction。

HandlerFunction 表示處理接收到的請求并生成響應的函數。 RouterFunction 替代了 @RequestMapping 注解。它用于将接收到的請求路由到處理函數。例如:

RouterFunction route =

route(GET("/hello-world"),

request -> Response.ok().body(fromObject("Hello World")));

5.反應式程式設計模型

Spring 5 最令人興奮的新特性是它的反應式程式設計模型。Spring 5 Framework 基于一種反應式基礎而建構,而且是完全異步和非阻塞的。隻需少量的線程,新的事件循環執行模型就可以垂直擴充。

該架構采用反應式流來提供在反應式元件中傳播負壓的機制。負壓是一個確定來自多個生産者的資料不會讓使用者不堪重負的概念。

Spring WebFlux 是 Spring 5 的反應式核心,它為開發人員提供了兩種為 Spring Web 程式設計而設計的程式設計模型:一種基于注解的模型和 Functional Web Framework (WebFlux.fn)。

基于注解的模型是 Spring WebMVC 的現代替代方案,該模型基于反應式基礎而建構,而 Functional Web Framework 是基于 @Controller 注解的程式設計模型的替代方案。這些模型都通過同一種反應式基礎來運作,後者調整非阻塞 HTTP 來适應反應式流 API。

6. 對Kotlin的支援

Spring 5.0對Kotlin的支援如下。

• 使用Kotlin1.1.50或更高版本時,可以支援Null安全的API。

• 支援帶有可選參數和預設值的Kotlin不可變類。

• 支援使用Kotlin DSL定義函數式Bean。

• 支援在WebFlux中使用有路由功能的Kotlin DSL。

• 利用Kotlin reified的類型參數來避免在各種API(如RestTemplate或WebFluxAPI)中明确指定用于序列化/反序列化的Class。

• 對@autowired、@Inject、@RequestParam和@RequestHeader等注解的Kotlin null安全支援,以确定注入點或處理程式方法參數是否合法。

• ScriptTemplateView中的Kotlin腳本支援Spring MVC和Spring WebFlux。

• 支援帶有可選參數的Kotlin自動裝配構造函數。

• Kotlin反射用于确定接口方法參數。

7. 額外庫支援

Spring 5.0現在支援下面的庫版本:

JackSon 2.6+

EhCache 2.10+ / 3.0 GA

Hibernate 5.0+

JDBC 4.0+

XmlUnit 2.x+

OkHttp 3.x+

Netty 4.1+

停止維護的一些特性

在Api層面上,Spring5.0不在支援下面的包了:

beans.factory.access

jdbc.support.nativejdbc

spring-aspects子產品的mock.staticmock

web.view.tiles2M. 現在Tiles 3是最低要求的版本

orm.hibernate3和orm.hibernate4.現在支援Hibernate5

8.不再支援如下庫:

Portlet

Velocity

JasperReports

XMLBeans

JDO

Guava

如果你在目前的項目中使用到了上面提到的這些庫,那麼最好不要更新到Spring5的版本

9.測試改進

Spring 5.0測試改進如下。

•在Spring TestContext Framework中完全支援JUnit 5 Jupiter程式設計和擴充模型。

•SpringExtension:是JUnit Jupiter的多個擴充API的實作,它為SpringTestContext Framework的現有功能集提供完全支援。通過@ExtendWith(SpringExtension.class)啟用此支援。

•@SpringJUnitConfig:一個複合注釋,它将來自JUnit Jupiter的“@ExtendWith(SpringExtension.class)”與來自Spring TestContext Framework的“@ContextConfiguration”相結合。

•@SpringJUnitWebConfig:一個複合注釋,它将來自JUnit Jupiter的“@ExtendWith(SpringExtension.class) ”與來自Spring TestContext Framework的“@ContextConfiguration”和“@WebAppConfiguration”相結合。

•@EnabledIf:如果提供的SpEL表達式或屬性占位符的計算結果為true,則表示已啟用帶注釋的測試類或測試方法。

•@DisabledIf:如果提供的SpEL表達式或屬性占位符的計算結果為true,則表示禁用帶注釋的測試類或測試方法。

•支援Spring TestContext Framework執行并行測試。

•Spring TestContext Framework新增測試之前和測試之後的執行回調功能。

•TestExecutionListener API和TestContextManager新增beforeTestExecution()和afterTestExecution()回調。

•MockHttpServletRequest現在具有用于通路請求體的方法getContentAsByteArray()和getContentAsString()。

•如果在模拟請求中設定了字元編碼,則Spring MVC Test中的print()和log()方法現在會列印請求主體。

•Spring MVC Test中的redirectedUrl()和forwardedUrl()方法現在支援具有可變參數擴充的URI模闆。

•XMLUnit支援更新到XMLUnit 2.3。