spring5新特性全面介紹
前方:對(duì)于很多開發(fā)人員來說,目前大都還在使用spring4的時(shí)候,而spring5早已經(jīng)發(fā)布。雖然你可能暫時(shí)還沒有使用到spring5,但還是需要對(duì)其有個(gè)大概的了解。
Spring 5 于 2017 年 9 月發(fā)布了通用版本 (GA),它標(biāo)志著自 2013 年 12 月以來第一個(gè)主要 Spring Framework 版本。它提供了一些人們期待已久的改進(jìn),還采用了一種全新的編程范例,以反應(yīng)式宣言中陳述的反應(yīng)式原則為基礎(chǔ)。
這個(gè)版本是很長(zhǎng)時(shí)間以來最令人興奮的 Spring Framework 版本。Spring 5 兼容 Java?8 和 JDK 9,它集成了反應(yīng)式流,以便提供一種顛覆性方法來實(shí)現(xiàn)端點(diǎn)和 Web 應(yīng)用程序開發(fā)。
誠然,反應(yīng)式編程不僅是此版本的主題,還是令許多開發(fā)人員激動(dòng)不已的重大特性。人們對(duì)能夠針對(duì)負(fù)載波動(dòng)進(jìn)行無縫擴(kuò)展的災(zāi)備和響應(yīng)式服務(wù)的需求在不斷增加,Spring 5 很好地滿足了這一需求。
我還會(huì)簡(jiǎn)要介紹測(cè)試和性能增強(qiáng),最后介紹對(duì) Spring 核心和容器的一般性修訂。
升級(jí)到 Java SE 8 和 Java EE 7
直到現(xiàn)在,Spring Framework 仍支持一些棄用的 Java 版本,但 Spring 5 已從舊包袱中解放出來。為了充分利用 Java 8 特性,它的代碼庫已進(jìn)行了改進(jìn),而且該框架要求將 Java 8 作為最低的 JDK 版本。
Spring 5 在類路徑(和模塊路徑)上完全兼容 Java 9,而且它通過了 JDK 9 測(cè)試套件的測(cè)試。對(duì) Java 9 愛好者而言,這是一條好消息,因?yàn)樵?Java 9 發(fā)布后,Spring 能立即使用它。
在 API 級(jí)別上,Spring 5 兼容 Java EE 8 技術(shù),滿足對(duì) Servlet 4.0、Bean Validation 2.0 和全新的 JSON Binding API 的需求。對(duì) Java EE API 的最低要求為 V7,該版本引入了針對(duì) Servlet、JPA 和 Bean Validation API 的次要版本。
反應(yīng)式編程模型
Spring 5 最令人興奮的新特性是它的反應(yīng)式編程模型。Spring 5 Framework 基于一種反應(yīng)式基礎(chǔ)而構(gòu)建,而且是完全異步和非阻塞的。只需少量的線程,新的事件循環(huán)執(zhí)行模型就可以垂直擴(kuò)展。
該框架采用反應(yīng)式流來提供在反應(yīng)式組件中傳播負(fù)壓的機(jī)制。負(fù)壓是一個(gè)確保來自多個(gè)生產(chǎn)者的數(shù)據(jù)不會(huì)讓使用者不堪重負(fù)的概念。
Spring WebFlux 是 Spring 5 的反應(yīng)式核心,它為開發(fā)人員提供了兩種為 Spring Web 編程而設(shè)計(jì)的編程模型:一種基于注解的模型和 Functional Web Framework (WebFlux.fn)。
基于注解的模型是 Spring WebMVC 的現(xiàn)代替代方案,該模型基于反應(yīng)式基礎(chǔ)而構(gòu)建,而 Functional Web Framework 是基于 @Controller 注解的編程模型的替代方案。這些模型都通過同一種反應(yīng)式基礎(chǔ)來運(yùn)行,后者調(diào)整非阻塞 HTTP 來適應(yīng)反應(yīng)式流 API。
使用注解進(jìn)行編程
WebMVC 程序員應(yīng)該對(duì) Spring 5 的基于注解的編程模型非常熟悉。Spring 5 調(diào)整了 WebMVC 的@Controller 編程模型,采用了相同的注解。
在清單 1 中,BookController 類提供了兩個(gè)方法,分別響應(yīng)針對(duì)某個(gè)圖書列表的 HTTP 請(qǐng)求,以及針對(duì)具有給定 id 的圖書的 HTTP 請(qǐng)求。請(qǐng)注意 resource 方法返回的對(duì)象(Mono 和 Flux)。這些對(duì)象是實(shí)現(xiàn)反應(yīng)式流規(guī)范中的 Publisher 接口的反應(yīng)式類型。它們的職責(zé)是處理數(shù)據(jù)流。Mono 對(duì)象處理一個(gè)僅含 1 個(gè)元素的流,而 Flux 表示一個(gè)包含 N 個(gè)元素的流。
清單 1. 反應(yīng)式控制器
@RestController public class BookController { @GetMapping("/book") Flux<Book> list() { return this.repository.findAll(); } @GetMapping("/book/{id}") Mono<Book> findById(@PathVariable String id) { return this.repository.findOne(id); } // Plumbing code omitted for brevity }
這是針對(duì) Spring Web 編程的注解。現(xiàn)在我們使用函數(shù)式 Web 框架來解決同一個(gè)問題。
函數(shù)式編程
Spring 5 的新函數(shù)式方法將請(qǐng)求委托給處理函數(shù),這些函數(shù)接受一個(gè)服務(wù)器請(qǐng)求實(shí)例并返回一種反應(yīng)式類型。清單 2 演示了這一過程,其中 listBook 和 getBook 方法類似于清單 1 中的功能。
清單 2. 清單 2.BookHandler 函數(shù)類
public class BookHandler { public Mono<ServerResponse> listBooks(ServerRequest request) { return ServerResponse.ok() .contentType(APPLICATION_JSON) .body(repository.allPeople(), Book.class); } public Mono<ServerResponse> getBook(ServerRequest request) { return repository.getBook(request.pathVariable("id")) .then(book -> ServerResponse.ok() .contentType(APPLICATION_JSON) .body(fromObject(book))) .otherwiseIfEmpty(ServerResponse.notFound().build()); } // Plumbing code omitted for brevity }
通過路由函數(shù)來匹配 HTTP 請(qǐng)求謂詞與媒體類型,將客戶端請(qǐng)求路由到處理函數(shù)。清單 3 展示了圖書資源端點(diǎn) URI 將調(diào)用委托給合適的處理函數(shù):
清單 3. Router 函數(shù)
BookHandler handler = new BookHandler(); RouterFunction<ServerResponse> personRoute = route( GET("/books/{id}") .and(accept(APPLICATION_JSON)), handler::getBook) .andRoute( GET("/books") .and(accept(APPLICATION_JSON)), handler::listBooks);
這些示例背后的數(shù)據(jù)存儲(chǔ)庫也支持完整的反應(yīng)式體驗(yàn),該體驗(yàn)是通過 Spring Data 對(duì)反應(yīng)式 Couchbase、Reactive MongoDB 和 Cassandra 的支持來實(shí)現(xiàn)的。
使用 REST 端點(diǎn)執(zhí)行反應(yīng)式編程
新的編程模型脫離了傳統(tǒng)的 Spring WebMVC 模型,引入了一些很不錯(cuò)的新特性。
舉例來說,WebFlux 模塊為 RestTemplate 提供了一種完全非阻塞、反應(yīng)式的替代方案,名為WebClient。清單 4 創(chuàng)建了一個(gè) WebClient,并調(diào)用 books 端點(diǎn)來請(qǐng)求一本給定 id 為 1234 的圖書。
清單 4. 通過 WebClient 調(diào)用 REST 端點(diǎn)
Mono<Book> book = WebClient.create("http://localhost:8080") .get() .url("/books/{id}", 1234) .accept(APPLICATION_JSON) .exchange(request) .then(response -> response.bodyToMono(Book.class));
HTTP/2 支持
HTTP/2 幕后原理:要了解 HTTP/2 如何提高傳輸性能,減少延遲,并幫助提高應(yīng)用程序吞吐量,從而提供經(jīng)過改進(jìn)的豐富 Web 體驗(yàn),請(qǐng)查閱我的有關(guān)這項(xiàng)期待已久的升級(jí)的文章。
Spring Framework 5.0 將提供專門的 HTTP/2 特性支持,還支持人們期望出現(xiàn)在 JDK 9 中的新 HTTP 客戶端。盡管 HTTP/2 的服務(wù)器推送功能已通過 Jetty servlet 引擎的 ServerPushFilter 類向 Spring 開發(fā)人員公開了很長(zhǎng)一段時(shí)間,但如果發(fā)現(xiàn) Spring 5 中開箱即用地提供了 HTTP/2性能增強(qiáng),Web 優(yōu)化者們一定會(huì)為此歡呼雀躍。
Java EE Servlet 規(guī)范預(yù)計(jì)將于 2017 年第 4 季度發(fā)布,Servlet 4.0 支持將在 Spring 5.1 中提供。到那時(shí),HTTP/2 特性將由 Tomcat 9.0、Jetty 9.3 和 Undertow 1.4 原生提供。
Kotlin 和 Spring WebFlux
Kotlin 是一種來自 JetBrains 的面向?qū)ο蟮恼Z言,它支持函數(shù)式編程。它的主要優(yōu)勢(shì)之一是與 Java 有非常高的互操作性。通過引入對(duì) Kotlin 的專門支持,Spring 在 V5 中全面吸納了這一優(yōu)勢(shì)。它的函數(shù)式編程風(fēng)格與 Spring WebFlux 模塊完美匹配,它的新路由 DSL 利用了函數(shù)式 Web 框架以及干凈且符合語言習(xí)慣的代碼??梢韵袂鍐?5 中這樣簡(jiǎn)單地表達(dá)端點(diǎn)路由:
清單 5. Kotlin 的用于定義端點(diǎn)的路由 DSL
@Bean fun apiRouter() = router { (accept(APPLICATION_JSON) and "/api").nest { "/book".nest { GET("/", bookHandler::findAll) GET("/{id}", bookHandler::findOne) } "/video".nest { GET("/", videoHandler::findAll) GET("/{genre}", videoHandler::findByGenre) } } }
使用 Kotlin 1.1.4+ 時(shí),還添加了對(duì) Kotlin 的不可變類的支持(通過帶默認(rèn)值的可選參數(shù)),以及對(duì)完全支持 null 的 API 的支持。
使用 Lambda 表達(dá)式注冊(cè) bean
作為傳統(tǒng) XML 和 JavaConfig 的替代方案,現(xiàn)在可以使用 lambda 表達(dá)式注冊(cè) Spring bean,使 bean 可以實(shí)際注冊(cè)為提供者。清單 6 使用 lambda 表達(dá)式注冊(cè)了一個(gè) Book bean。
清單 6. 將 Bean 注冊(cè)為提供者
GenericApplicationContext context = new GenericApplicationContext(); context.registerBean(Book.class, () -> new Book(context.getBean(Author.class)) );
Spring WebMVC 支持最新的 API
全新的 WebFlux 模塊提供了許多新的、令人興奮的功能,但 Spring 5 也迎合了愿意繼續(xù)使用 Spring MVC 的開發(fā)人員的需求。Spring 5 中更新了模型-視圖-控制器框架,以兼容 WebFlux 和最新版的Jackson 2.9 和 Protobuf 3.0,甚至包括對(duì)新的 Java EE 8 JSON-Binding API 的支持。
除了 HTTP/2 特性的基礎(chǔ)服務(wù)器實(shí)現(xiàn)之外,Spring WebMVC 還通過 MVC 控制器方法的一個(gè)參數(shù)來支持 Servlet 4.0 的 PushBuilder。最后,WebMVC 全面支持 Reactor 3.1 的 Flux 和 Mono 對(duì)象,以及 RxJava1.3 和 2.1,它們被視為來自 MVC 控制器方法的返回值。這項(xiàng)支持的最終目的是支持 Spring Data 中的新的反應(yīng)式 WebClient 和反應(yīng)式存儲(chǔ)庫。
使用 JUnit 5 執(zhí)行條件和并發(fā)測(cè)試
JUnit 和 Spring 5:Spring 5 全面接納了函數(shù)式范例,并支持 JUnit 5 及其新的函數(shù)式測(cè)試風(fēng)格。還提供了對(duì) JUnit 4 的向后兼容性,以確保不會(huì)破壞舊代碼。
Spring 5 的測(cè)試套件通過多種方式得到了增強(qiáng),但最明顯的是它對(duì)JUnit 5 的支持。現(xiàn)在可以在您的單元測(cè)試中利用 Java 8 中提供的函數(shù)式編程特性。清單 7 演示了這一支持:
清單 7. 清單 7.JUnit 5 全面接納了 Java 8 流和 lambda 表達(dá)式
@Test void givenStreamOfInts_SumShouldBeMoreThanFive() { assertTrue(Stream.of(20, 40, 50) .stream() .mapToInt(i -> i) .sum() > 110, () -> "Total should be more than 100"); }
遷移到 JUnit 5:如果您對(duì)升級(jí)到 JUnit 5 持觀望態(tài)度,Steve Perry 的分兩部分的深入剖析教程將說服您冒險(xiǎn)嘗試。
Spring 5 繼承了 JUnit 5 在 Spring TestContext Framework 內(nèi)實(shí)現(xiàn)多個(gè)擴(kuò)展 API 的靈活性。舉例而言,開發(fā)人員可以使用 JUnit 5 的條件測(cè)試執(zhí)行注解 @EnabledIf 和 @DisabledIf 來自動(dòng)計(jì)算一個(gè) SpEL (Spring Expression Language) 表達(dá)式,并適當(dāng)?shù)貑⒂没蚪脺y(cè)試。借助這些注解,Spring 5 支持以前很難實(shí)現(xiàn)的復(fù)雜的條件測(cè)試方案。Spring TextContext Framework 現(xiàn)在能夠并發(fā)執(zhí)行測(cè)試。
使用 Spring WebFlux 執(zhí)行集成測(cè)試
Spring Test 現(xiàn)在包含一個(gè) WebTestClient,后者支持對(duì) Spring WebFlux 服務(wù)器端點(diǎn)執(zhí)行集成測(cè)試。WebTestClient 使用模擬請(qǐng)求和響應(yīng)來避免耗盡服務(wù)器資源,并能直接綁定到 WebFlux 服務(wù)器基礎(chǔ)架構(gòu)。
WebTestClient 可綁定到真實(shí)的服務(wù)器,或者使用控制器或函數(shù)。在清單 8 中,WebTestClient 被綁定到 localhost:
清單 8. 綁定到 localhost 的 WebTestClient
WebTestClient testClient = WebTestClient .bindToServer() .baseUrl("http://localhost:8080") .build();
在清單 9 中,測(cè)試了 RouterFunction:
清單 9. 將 WebTestClient 綁定到 RouterFunction
RouterFunction bookRouter = RouterFunctions.route( RequestPredicates.GET("/books"), request -> ServerResponse.ok().build() ); WebTestClient .bindToRouterFunction(bookRouter) .build().get().uri("/books") .exchange() .expectStatus().isOk() .expectBody().isEmpty();
包清理和棄用
Spring 5 中止了對(duì)一些過時(shí) API 的支持。遭此厄運(yùn)的還有 Hibernate 3 和 4,為了支持 Hibernate 5,它們?cè)獾搅藯売?。另外,?duì) Portlet、Velocity、JasperReports、XMLBeans、JDO 和 Guava 的支持也已中止。
包級(jí)別上的清理工作仍在繼續(xù):Spring 5 不再支持beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(來自 spring-aspects 模塊)或 web.view.tiles2M。Tiles 3 現(xiàn)在是 Spring 的最低要求。
對(duì) Spring 核心和容器的一般更新
Spring Framework 5 改進(jìn)了掃描和識(shí)別組件的方法,使大型項(xiàng)目的性能得到提升。目前,掃描是在編譯時(shí)執(zhí)行的,而且向 META-INF/spring.components 文件中的索引文件添加了組件坐標(biāo)。該索引是通過一個(gè)為項(xiàng)目定義的特定于平臺(tái)的應(yīng)用程序構(gòu)建任務(wù)來生成的。
標(biāo)有來自 javax 包的注解的組件會(huì)添加到索引中,任何帶 @Index 注解的類或接口都會(huì)添加到索引中。Spring 的傳統(tǒng)類路徑掃描方式?jīng)]有刪除,而是保留為一種后備選擇。有許多針對(duì)大型代碼庫的明顯性能優(yōu)勢(shì),而托管許多 Spring 項(xiàng)目的服務(wù)器也會(huì)縮短啟動(dòng)時(shí)間。
Spring 5 還添加了對(duì) @Nullable 的支持,后者可用于指示可選的注入點(diǎn)。使用者現(xiàn)在必須準(zhǔn)備接受 null 值。此外,還可以使用此注解來標(biāo)記可以為 null 的參數(shù)、字段和返回值。@Nullable 主要用于 IntelliJ IDEA 等 IDE,但也可用于 Eclipse 和 FindBugs,它使得在編譯時(shí)處理 null 值變得更方便,而無需在運(yùn)行時(shí)發(fā)送 NullPointerExceptions。
Spring Logging 還提升了性能,自帶開箱即用的 Commons Logging 橋接器。現(xiàn)在已通過資源抽象支持防御性編程,為 getFile 訪問提供了 isFile 指示器。
結(jié)束語
Spring 5 的首要特性是新的反應(yīng)式編程模型,這代表著對(duì)提供可無縫擴(kuò)展、基于 Spring 的響應(yīng)式服務(wù)的重大保障。隨著人們對(duì) Spring 5 的采用,開發(fā)人員有望看到反應(yīng)式編程將會(huì)成為使用 Java 語言的 Web 和企業(yè)應(yīng)用程序開發(fā)的未來發(fā)展道路。
未來的 Spring Framework 版本將繼續(xù)反映這一承諾,因?yàn)?Spring Security、Spring Data 和 Spring Integration 有望采用反應(yīng)式編程的特征和優(yōu)勢(shì)。
總之,Spring 5 代表著一次大受 Spring 開發(fā)人員歡迎的范例轉(zhuǎn)變,同時(shí)也為其他框架指出了一條發(fā)展之路。
以上就是spring5新特性全面介紹的詳細(xì)內(nèi)容,更多關(guān)于spring5新特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JAVA JNI原理詳細(xì)介紹及簡(jiǎn)單實(shí)例代碼
這篇文章主要介紹了JAVA JNI原理的相關(guān)資料,這里提供簡(jiǎn)單實(shí)例代碼,需要的朋友可以參考下2016-12-12Java實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以借鑒一下2022-11-11java網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)介紹
這篇文章主要介紹了java網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)介紹,涉及OSI分層模型和TCP/IP分層模型的對(duì)應(yīng)關(guān)系、IP地址、端口號(hào)、tcp、udp等相關(guān)內(nèi)容,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11MyBatis-Plus通過version機(jī)制實(shí)現(xiàn)樂觀鎖的思路
version機(jī)制的核心思想就是,假設(shè)發(fā)生并發(fā)沖突的幾率很低,只有當(dāng)更新數(shù)據(jù)的時(shí)候采取檢查是否有沖突,而判斷是否有沖突的依據(jù)就是version的值是否被改變了,這篇文章主要介紹了MyBatis-Plus通過version機(jī)制實(shí)現(xiàn)樂觀鎖的思路,需要的朋友可以參考下2021-09-09Spring MVC的優(yōu)點(diǎn)與核心接口_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Spring MVC的優(yōu)點(diǎn)與核心接口,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08java實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12為什么不推薦使用BeanUtils屬性轉(zhuǎn)換工具示例詳解
這篇文章主要介紹了為什么不推薦使用BeanUtils屬性轉(zhuǎn)換工具,本文通過示例代碼給大家詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07