1. 程式人生 > >Spring學習總結(23)——Spring Framework 5.0 新特性

Spring學習總結(23)——Spring Framework 5.0 新特性

Spring Framework 5.0 是自 2013年12月版本 4 釋出之後 Spring Framework 的第一個主發行版。Spring Framework 專案的領導人 Juergen Hoeller 於 2016 年 7 月 28 日宣佈了第一個 Spring Framework 5.0 里程碑版本(5.0 M1)。

現在,將近一年的時間過去以後,我們期盼已久的 RC3 版本將於 2017 年 7 月 18 日發行。這是路線圖規劃中 Spring Framework 5.0 首個 GA 發行版的最後一次發行。

從高層來看,Spring Framework 5.0 的功能可以分為:

  • JDK 基線更新

  • 核心框架修正

  • 核心容器更新

  • 含 Kotlin 在內的函數語言程式設計

  • 響應式程式設計模型

  • 測試改進

  • 庫支援

  • 中止支援

Spring Framework 5.0 的 JDK 基線更新

整個 Spring framework 5.0 程式碼庫運行於 Java 8 之上。因此 Spring Framework 5.0 對環境的最低要就就是 Java 8。

這一點實際上對框架而言非常重要。而作為開發者的我們而言,則已經能夠去藉此來享受到現代 Java 發行版中的所有新特性了。而框架版本還揹負這支援已經不被建議使用的 Java 發行版的任務。

現在,框架的最低要求是 Java 8.

Spring Framework 5.0 原來是計劃在 Java 9 之上發行的。然後,在基於 Java 9 的發行版運作了超過 18 個月之後, 

Spring 團隊決定將 Spring Framework 5.0 發行版同 Java 9 的繫結關係解除。

不過,在 Java 9 釋出的時候(計劃是2017年9月份), Spring Framework 5.0 會準備好的。

核心框架修訂

核心的 Spring Framework 5.0 已經利用 Java 8 所引入的新特性進行了修訂。比較關鍵的一些如下:

  • 基於 Java 8 的反射增強,  Spring Framework 5.0 中的方法引數可以更加高效的進行訪問。

  • 核心的 Spring 介面現在提供基於Java 8 的預設方法構建的選擇性宣告。

  • 用 @Nullable 和 @NotNull 註解來顯示錶明可為空的引數和以及返回值。這樣就夠在編譯的時候處理空值而不是在執行時丟擲 NullPointerExceptions。

在日誌記錄方面, Spring Framework 5.0 帶來了 Commons Logging 橋接模組的封裝, 它被叫做 spring-jcl 而不是標準的 Commons Logging。當然,無需任何額外的橋接,新版本也會對 Log4j 2.x, SLF4J, JUL ( java.util.logging) 進行自動檢測。

有了 Resourse 抽象所提供的 isFile 指示器以及 getFile 方法,防禦式程式設計方法也得到了框架的推動。

核心容器更新

Spring Framework 5.0 現在支援候選元件索引作為類路徑掃描的替代方案。該功能已經在類路徑掃描器中新增,以簡化新增候選元件標識的步驟。

應用程式構建任務可以定義當前專案自己的 META-INF/spring.components 檔案。在編譯時,源模型是自包含的,JPA 實體和 Spring 元件是已被標記的。

從索引讀取實體而不是掃描類路徑對於小於 200 個類的小型專案是沒有明顯差異。但對大型專案影響較大。載入元件索引開銷更低。因此,隨著類數的增加,索引讀取的啟動時間將保持不變。

載入元件索引的耗費是廉價的。因此當類的數量不斷增長,加上構建索引的啟動時間仍然可以維持一個常數, 不過對於元件掃描而言,啟動時間則會有明顯的增長。

這個對於我們處於大型 Spring 專案的開發者所意味著的,是應用程式的啟動時間將被大大縮減。雖然 20 或者 30 秒鐘看似沒什麼,但如果每天要這樣登上好幾百次,加起來就夠你受的了。使用了元件索引的話,就能幫助你每天過的更加高效。

你可以在 Spring 的 Jira上了解更多關於元件索引的相關資訊。

@Nullable 註解現在也可以被用來作為可選注入項的指示器。@Nullable 為物件使用方規定了一項義務,就是它們必須準備以為取值為 null 的值。在此次釋出之前,實現這件事情的唯一方法就是通過 Android 的 NullableChecker Framework 的 Nullable, 以及 JSR 305 的 Nullable

發行說明中的其他一些新功能和增強功能包括:

  • 在 GenericApplicationContext 和 AnnotationConfigApplicationContext 中實現函數語言程式設計風格。

  • 對介面方法的事務、快取和非同步註釋的一致性檢測。

  • 將 XML 配置名稱空間簡化為無版本化的模式。

使用 Kotlin 進行函數語言程式設計

Spring Framework 5.0 引入了對 JetBrains Kotlin 語言的支援。Kotlin 是一種支援函數語言程式設計程式設計風格的面嚮物件語言。Kotlin 執行在 JVM 之上,但執行環境並不限於 JVM。

有了對 Kotlin 的支援,開發者可以進行深度的函式式 Spring 程式設計,特別是在函式式 Web 端點以及 Bean 註冊這些方面。

在 Spring Framework 5.0 中, 你可以為 WEB 的函式式 API 編寫乾淨且地道的 Kotlin 程式碼,就像下面這樣:

01 {
02 ("/movie" and accept(TEXT_HTML)).nest {
03 GET("/", movieHandler::findAllView)
04 GET("/{card}", movieHandler::findOneView)
05 }
06 ("/api/movie" and accept(APPLICATION_JSON)).nest {
07 GET("/", movieApiHandler::findAll)
08 GET("/{id}", movieApiHandler::findOne)
09 }
10 }

對於 Bean 的註冊,作為 XML 或者 @Configuration 以及 @Bean 的替代辦法, 現在你可以使用 Kotlin 來註冊 Spring Bean了,就像下面這樣:

1 val context = GenericApplicationContext {
2 registerBean()
3 registerBean { Cinema(it.getBean()) }
4 }

點選這裡瞭解我的新的 Spring Framework 5 課程的相關資訊!

響應式程式設計模型

此次 Spring 發行版本的一個激動人心的特性就是新的響應式堆疊 WEB 框架。這個堆疊完全的響應式且非阻塞,適合於事件迴圈風格的處理,可以進行少量執行緒的擴充套件。

Reactive Streams 是來自於 Netflix, Pivotal, Typesafe, Red Hat, Oracle, Twitter 以及 Spray.io 的工程師特地開發的一個 API。它為響應式程式設計實現的實現提供一個公共的 API,好實現 Hibernate 的 JPA。這裡 JPA 就是這個 API, 而 Hibernate 就是實現。

Reactive Streams API 是 Java 9 的官方版本的一部分。在 Java 8 中, 你會需要專門引入依賴來使用 Reactive Streams API。

Spring Framework 5.0 對於流式處理的支援依賴於 Project Reactor 來構建, 其專門實現了 Reactive Streams API。

Spring Framework 5.0 擁有一個新的 spring-webflux 模組,支援響應式 HTTP 和 WebSocket 客戶端。Spring Framework 5.0 還提供了對於運行於伺服器之上,包含了 REST, HTML, 以及 WebSocket 風格互動的響應式網頁應用程式的支援。

在 spring-webflux 中包含了兩種獨立的服務端程式設計模型:

  • 基於註解:使用到了@Controller 以及 Spring MVC 的其它一些註解;

  • 使用 Java 8 lambda 表示式的函式式風格的路由和處理。

有了 Spring Webflux, 你現在可以創建出 WebClient, 它是響應式且非阻塞的,可以作為 RestTemplate 的一個替代方案。

這裡有一個使用 Spring 5.0 的 REST 端點的 WebClient 實現:

1 WebClient webClient = WebClient.create();
2 Mono person = webClient.get()
3 .uri("http://localhost:8080/movie/42")
4 .accept(MediaType.APPLICATION_JSON)
5 .exchange()
6 .then(response -> response.bodyToMono(Movie.class));

儘管新的 WebFlux 模組給我麼帶來了激動人心的新能力,傳統的 Spring MVC 在  Spring Framework 5.0 仍然得到了完整的支援。

測試方面的提升

Spring Framework 5.0 完全支援 JUnit 5 Jupiter,所以可以使用 JUnit 5 來編寫測試以及擴充套件。此外還提供了一個程式設計以及擴充套件模型,Jupiter 子專案提供了一個測試引擎來在 Spring 上執行基於 Jupiter 的測試。

另外,Spring Framework 5 還提供了在 Spring TestContext Framework 中進行並行測試的擴充套件。

針對響應式程式設計模型, spring-test 現在還引入了支援 Spring WebFlux 的 WebTestClient 整合測試的支援,類似於 MockMvc,並不需要一個執行著的服務端。使用一個模擬的請求或者響應, WebTestClient 就可以直接繫結到 WebFlux 服務端設施。

你可以在這裡找到這個激動人心的 TestContext 框架所帶來的增強功能的完整列表。

當然, Spring Framework 5.0 仍然支援我們的老朋友 JUnit! 在我寫這篇文章的時候, JUnit 5 還只是發展到了 GA 版本。對於 JUnit4, Spring Framework 在未來還是要支援一段時間的。

庫支援

Spring Framework 5.0目前支援以下升級庫的版本 :

中止的支援

在 API 層面,Spring Framework 5.0 不再支援以下包:

  • beans.factory.access 

  • jdbc.support.nativejdbc 

  • spring-aspects 模組的 mock.staticmock

  • web.view.tiles2M.(最低要求 Tiles 3)

  • orm.hibernate3 和 orm.hibernate4. 目前 Hibernate 5 是支援的框架。

Spring Framework 5.0 同時也停止了對以下庫的支援:

  • Portlet.

  • Velocity.

  • JasperReports.

  • XMLBeans.

  • JDO.

  • Guava.

如果你正在使用任何上面的包,建議你將 Spring Framework 版本維持在 4.3.x。

結語

Spring Framework 5.0 的亮點絕對是響應式程式設計,這是一個重要的正規化轉變。你可以將 Spring Framework 5.0 作為響應式程式的基礎版本。對於 2017 年及以後的剩餘時間裡,你可以期待看到子專案實現響應式特性。你將看到即將釋出的 Spring Data、Spring Security、Spring Integration 等版本所提供的響應式程式設計功能。

Spring Data 團隊已經為 MongoDB 和 Redis 實現了響應式支援。
使用 JDBC 獲取響應式支援還為時過早。JDBC 規範本身就是阻塞的,在傳統的 JDBC 資料庫中看到響應式程式設計的還需要一段時間。
雖然響應式程式設計是 Spring Framework 5.0 中的閃光點,但它不會在任何地方得到支援。 下游技術需要提供響應式支援。
隨著響應式程式設計越來越受歡迎,我們可以期待越來越多的技術將實現響應式解決方案。 當然,我們可以期待 Spring 框架隨著其他的響應式程式設計方案的使用而發展