【轉(zhuǎn)】Spring Framework 5.0 新特性

地址:https://www.oschina.net/translate/whats-new-in-spring-framework-5



Spring Framework 5.0 是自 2013年12月版本?4 發(fā)布之后 Spring Framework 的第一個(gè)主發(fā)行版。Spring Framework 項(xiàng)目的領(lǐng)導(dǎo)人?Juergen Hoeller于 2016 年 7 月 28 日宣布了第一個(gè)?Spring Framework 5.0 里程碑版本(5.0 M1)贯要。

現(xiàn)在缭受,將近一年的時(shí)間過(guò)去以后塌西,我們期盼已久的 RC3 版本將于 2017 年 7 月 18 日發(fā)行。這是路線圖規(guī)劃中?Spring Framework 5.0?首個(gè) GA 發(fā)行版的最后一次發(fā)行叽唱。


從高層來(lái)看煞茫,Spring Framework 5.0 的功能可以分為:

JDK 基線更新

核心框架修正

核心容器更新

含 Kotlin 在內(nèi)的函數(shù)式編程

響應(yīng)式編程模型

測(cè)試改進(jìn)

庫(kù)支持

中止支持


Spring Framework 5.0 的 JDK 基線更新

整個(gè) Spring framework 5.0 代碼庫(kù)運(yùn)行于 Java 8 之上。因此?Spring Framework 5.0 對(duì)環(huán)境的最低要就就是 Java 8地消。

這一點(diǎn)實(shí)際上對(duì)框架而言非常重要。而作為開(kāi)發(fā)者的我們而言畏妖,則已經(jīng)能夠去藉此來(lái)享受到現(xiàn)代 Java 發(fā)行版中的所有新特性了脉执。而框架版本還背負(fù)這支持已經(jīng)不被建議使用的 Java 發(fā)行版的任務(wù)。

現(xiàn)在瓜客,框架的最低要求是 Java 8.

Spring Framework 5.0 原來(lái)是計(jì)劃在 Java 9 之上發(fā)行的适瓦。然后竿开,在基于 Java 9 的發(fā)行版運(yùn)作了超過(guò) 18 個(gè)月之后谱仪,Spring 團(tuán)隊(duì)決定將?Spring Framework 5.0 發(fā)行版同 Java 9 的綁定關(guān)系解除。

不過(guò)否彩,在 Java 9 發(fā)布的時(shí)候(計(jì)劃是2017年9月份), Spring Framework 5.0 會(huì)準(zhǔn)備好的疯攒。


核心框架修訂

核心的 Spring Framework 5.0 已經(jīng)利用 Java 8 所引入的新特性進(jìn)行了修訂。比較關(guān)鍵的一些如下:

基于 Java 8 的反射增強(qiáng), ?Spring Framework 5.0 中的方法參數(shù)可以更加高效的進(jìn)行訪問(wèn)列荔。

核心的 Spring 接口現(xiàn)在提供基于Java 8 的默認(rèn)方法構(gòu)建的選擇性聲明敬尺。

用 @Nullable?和 @NotNull 注解來(lái)顯示表明可為空的參數(shù)和以及返回值。這樣就夠在編譯的時(shí)候處理空值而不是在運(yùn)行時(shí)拋出?NullPointerExceptions贴浙。

在日志記錄方面砂吞, Spring Framework 5.0 帶來(lái)了 Commons Logging 橋接模塊的封裝, 它被叫做 spring-jcl 而不是標(biāo)準(zhǔn)的 Commons Logging。當(dāng)然崎溃,無(wú)需任何額外的橋接蜻直,新版本也會(huì)對(duì) Log4j 2.x, SLF4J, JUL ( java.util.logging) 進(jìn)行自動(dòng)檢測(cè)。

有了 Resourse 抽象所提供的 isFile 指示器以及 getFile 方法袁串,防御式編程方法也得到了框架的推動(dòng)概而。


核心容器更新

Spring Framework 5.0 現(xiàn)在支持候選組件索引作為類路徑掃描的替代方案。該功能已經(jīng)在類路徑掃描器中添加囱修,以簡(jiǎn)化添加候選組件標(biāo)識(shí)的步驟赎瑰。

應(yīng)用程序構(gòu)建任務(wù)可以定義當(dāng)前項(xiàng)目自己的 META-INF/spring.components 文件。在編譯時(shí)破镰,源模型是自包含的餐曼,JPA 實(shí)體和 Spring 組件是已被標(biāo)記的压储。

從索引讀取實(shí)體而不是掃描類路徑對(duì)于小于 200 個(gè)類的小型項(xiàng)目是沒(méi)有明顯差異。但對(duì)大型項(xiàng)目影響較大晋辆。加載組件索引開(kāi)銷更低渠脉。因此,隨著類數(shù)的增加瓶佳,索引讀取的啟動(dòng)時(shí)間將保持不變芋膘。


加載組件索引的耗費(fèi)是廉價(jià)的。因此當(dāng)類的數(shù)量不斷增長(zhǎng)霸饲,加上構(gòu)建索引的啟動(dòng)時(shí)間仍然可以維持一個(gè)常數(shù), 不過(guò)對(duì)于組件掃描而言为朋,啟動(dòng)時(shí)間則會(huì)有明顯的增長(zhǎng)。

這個(gè)對(duì)于我們處于大型 Spring 項(xiàng)目的開(kāi)發(fā)者所意味著的,是應(yīng)用程序的啟動(dòng)時(shí)間將被大大縮減羊苟。雖然 20 或者 30 秒鐘看似沒(méi)什么垮卓,但如果每天要這樣登上好幾百次,加起來(lái)就夠你受的了霞溪。使用了組件索引的話,就能幫助你每天過(guò)的更加高效中捆。

你可以在Spring 的 Jira上了解更多關(guān)于組件索引的相關(guān)信息鸯匹。

@Nullable 注解現(xiàn)在也可以被用來(lái)作為可選注入項(xiàng)的指示器。@Nullable 為對(duì)象使用方規(guī)定了一項(xiàng)義務(wù)泄伪,就是它們必須準(zhǔn)備以為取值為 null 的值殴蓬。在此次發(fā)布之前,實(shí)現(xiàn)這件事情的唯一方法就是通過(guò)Android 的 Nullable,Checker Framework 的 Nullable, 以及JSR 305 的 Nullable蟋滴。


發(fā)行說(shuō)明中的其他一些新功能和增強(qiáng)功能包括:

在 GenericApplicationContext 和 AnnotationConfigApplicationContext 中實(shí)現(xiàn)函數(shù)式編程風(fēng)格染厅。

對(duì)接口方法的事務(wù)、緩存和異步注釋的一致性檢測(cè)津函。

將 XML 配置命名空間簡(jiǎn)化為無(wú)版本化的模式肖粮。


使用 Kotlin 進(jìn)行函數(shù)式編程

Spring Framework 5.0 引入了對(duì) JetBrainsKotlin語(yǔ)言的支持。Kotlin 是一種支持函數(shù)式編程編程風(fēng)格的面向?qū)ο笳Z(yǔ)言尔苦。Kotlin 運(yùn)行在 JVM 之上涩馆,但運(yùn)行環(huán)境并不限于 JVM。

有了對(duì) Kotlin 的支持蕉堰,開(kāi)發(fā)者可以進(jìn)行深度的函數(shù)式 Spring 編程凌净,特別是在函數(shù)式 Web 端點(diǎn)以及 Bean 注冊(cè)這些方面。

在 Spring Framework 5.0 中, 你可以為 WEB 的函數(shù)式 API 編寫干凈且地道的 Kotlin 代碼屋讶,就像下面這樣:

{("/movie"andaccept(TEXT_HTML)).nest{GET("/",?movieHandler::findAllView)GET("/{card}",?movieHandler::findOneView)}("/api/movie"andaccept(APPLICATION_JSON)).nest{GET("/",?movieApiHandler::findAll)GET("/{id}",?movieApiHandler::findOne)}}

對(duì)于 Bean 的注冊(cè)冰寻,作為 XML 或者?@Configuration?以及?@Bean 的替代辦法, 現(xiàn)在你可以使用 Kotlin 來(lái)注冊(cè) Spring Bean了,就像下面這樣:

val?context?=?GenericApplicationContext?{

registerBean()

registerBean?{?Cinema(it.getBean())?}

}

點(diǎn)擊這里了解我的新的 Spring Framework 5 課程的相關(guān)信息!



響應(yīng)式編程模型

此次 Spring 發(fā)行版本的一個(gè)激動(dòng)人心的特性就是新的響應(yīng)式堆棧 WEB 框架皿渗。這個(gè)堆棧完全的響應(yīng)式且非阻塞斩芭,適合于事件循環(huán)風(fēng)格的處理轻腺,可以進(jìn)行少量線程的擴(kuò)展。

Reactive Streams是來(lái)自于 Netflix, Pivotal, Typesafe, Red Hat, Oracle, Twitter 以及 Spray.io 的工程師特地開(kāi)發(fā)的一個(gè) API划乖。它為響應(yīng)式編程實(shí)現(xiàn)的實(shí)現(xiàn)提供一個(gè)公共的 API贬养,好實(shí)現(xiàn) Hibernate 的 JPA。這里 JPA 就是這個(gè) API, 而 Hibernate 就是實(shí)現(xiàn)琴庵。

Reactive Streams API 是 Java 9 的官方版本的一部分误算。在?Java 8 中, 你會(huì)需要專門引入依賴來(lái)使用 Reactive Streams API。



Spring Framework 5.0 對(duì)于流式處理的支持依賴于Project Reactor來(lái)構(gòu)建, 其專門實(shí)現(xiàn)了 Reactive Streams API迷殿。

Spring Framework 5.0 擁有一個(gè)新的 spring-webflux 模塊儿礼,支持響應(yīng)式 HTTP 和 WebSocket 客戶端。Spring Framework 5.0 還提供了對(duì)于運(yùn)行于服務(wù)器之上庆寺,包含了 REST, HTML, 以及 WebSocket 風(fēng)格交互的響應(yīng)式網(wǎng)頁(yè)應(yīng)用程序的支持蚊夫。

在 spring-webflux 中包含了兩種獨(dú)立的服務(wù)端編程模型:

基于注解:使用到了@Controller 以及 Spring MVC 的其它一些注解;

使用 Java 8 lambda 表達(dá)式的函數(shù)式風(fēng)格的路由和處理懦尝。

有了 Spring Webflux, 你現(xiàn)在可以創(chuàng)建出 WebClient, 它是響應(yīng)式且非阻塞的知纷,可以作為 RestTemplate 的一個(gè)替代方案。

這里有一個(gè)使用 Spring 5.0 的 REST 端點(diǎn)的 WebClient 實(shí)現(xiàn):

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

盡管新的 WebFlux 模塊給我么帶來(lái)了激動(dòng)人心的新能力陵霉,傳統(tǒng)的 Spring MVC 在 ?Spring Framework 5.0 仍然得到了完整的支持琅轧。


Spring Framework 5.0 完全支持JUnit 5 Jupiter,所以可以使用?JUnit 5 來(lái)編寫測(cè)試以及擴(kuò)展撩匕。此外還提供了一個(gè)編程以及擴(kuò)展模型鹰晨,Jupiter 子項(xiàng)目提供了一個(gè)測(cè)試引擎來(lái)在 Spring 上運(yùn)行基于 Jupiter 的測(cè)試墨叛。

另外止毕,Spring Framework 5 還提供了在 Spring TestContext Framework 中進(jìn)行并行測(cè)試的擴(kuò)展。

針對(duì)響應(yīng)式編程模型漠趁, spring-test 現(xiàn)在還引入了支持 Spring WebFlux 的 WebTestClient 集成測(cè)試的支持扁凛,類似于?MockMvc,并不需要一個(gè)運(yùn)行著的服務(wù)端闯传。使用一個(gè)模擬的請(qǐng)求或者響應(yīng)谨朝, WebTestClient 就可以直接綁定到 WebFlux 服務(wù)端設(shè)施。

你可以在這里找到這個(gè)激動(dòng)人心的 TestContext 框架所帶來(lái)的增強(qiáng)功能的完整列表甥绿。

當(dāng)然字币, Spring Framework 5.0 仍然支持我們的老朋友 JUnit! 在我寫這篇文章的時(shí)候, JUnit 5 還只是發(fā)展到了 GA 版本共缕。對(duì)于 JUnit4洗出, Spring Framework 在未來(lái)還是要支持一段時(shí)間的。


庫(kù)支持

Spring Framework 5.0目前支持以下升級(jí)庫(kù)的版本 :

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 層面图谷,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 同時(shí)也停止了對(duì)以下庫(kù)的支持:

Portlet.

Velocity.

JasperReports.

XMLBeans.

JDO.

Guava.

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


結(jié)語(yǔ)

Spring Framework 5.0 的亮點(diǎn)絕對(duì)是響應(yīng)式編程菠镇,這是一個(gè)重要的范式轉(zhuǎn)變冗荸。你可以將 Spring Framework 5.0 作為響應(yīng)式程序的基礎(chǔ)版本。對(duì)于 2017 年及以后的剩余時(shí)間里利耍,你可以期待看到子項(xiàng)目實(shí)現(xiàn)響應(yīng)式特性蚌本。你將看到即將發(fā)布的 Spring Data、Spring Security隘梨、Spring Integration 等版本所提供的響應(yīng)式編程功能魂毁。


Spring Data 團(tuán)隊(duì)已經(jīng)為 MongoDB 和 Redis 實(shí)現(xiàn)了響應(yīng)式支持。

使用 JDBC 獲取響應(yīng)式支持還為時(shí)過(guò)早出嘹。JDBC 規(guī)范本身就是阻塞的席楚,在傳統(tǒng)的 JDBC 數(shù)據(jù)庫(kù)中看到響應(yīng)式編程的還需要一段時(shí)間。

雖然響應(yīng)式編程是 Spring Framework 5.0 中的閃光點(diǎn)税稼,但它不會(huì)在任何地方得到支持烦秩。 下游技術(shù)需要提供響應(yīng)式支持。

隨著響應(yīng)式編程越來(lái)越受歡迎郎仆,我們可以期待越來(lái)越多的技術(shù)將實(shí)現(xiàn)響應(yīng)式解決方案只祠。 當(dāng)然,我們可以期待 Spring 框架隨著其他的響應(yīng)式編程方案的使用而發(fā)展扰肌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抛寝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子曙旭,更是在濱河造成了極大的恐慌盗舰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桂躏,死亡現(xiàn)場(chǎng)離奇詭異钻趋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剂习,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蛮位,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鳞绕,你說(shuō)我怎么就攤上這事失仁。” “怎么了们何?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵萄焦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我垂蜗,道長(zhǎng)楷扬,這世上最難降的妖魔是什么解幽? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮烘苹,結(jié)果婚禮上躲株,老公的妹妹穿的比我還像新娘。我一直安慰自己镣衡,他們只是感情好霜定,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著廊鸥,像睡著了一般望浩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惰说,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天磨德,我揣著相機(jī)與錄音,去河邊找鬼吆视。 笑死典挑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啦吧。 我是一名探鬼主播您觉,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼授滓!你這毒婦竟也來(lái)了琳水?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤般堆,失蹤者是張志新(化名)和其女友劉穎在孝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體郁妈,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浑玛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年绍申,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了噩咪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡极阅,死狀恐怖胃碾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筋搏,我是刑警寧澤仆百,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站奔脐,受9級(jí)特大地震影響俄周,放射性物質(zhì)發(fā)生泄漏吁讨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一峦朗、第九天 我趴在偏房一處隱蔽的房頂上張望建丧。 院中可真熱鬧,春花似錦波势、人聲如沸翎朱。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拴曲。三九已至,卻和暖如春凛忿,著一層夾襖步出監(jiān)牢的瞬間澈灼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工店溢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕉汪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓逞怨,卻偏偏與公主長(zhǎng)得像者疤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叠赦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容