本篇文章給大家分享的是有關(guān)Spring 5的新特性有哪些呢,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
蕪湖縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
Spring5于2017年9月發(fā)布了通用版本,它是自2013年12月以來第一個(gè)主要的Spring版本。它提供了一些人們期待已久的改進(jìn),還采用了一種全新的編程范例,以反應(yīng)式原則為基礎(chǔ)。
這個(gè)版本是很長時(shí)間以來最令人激動(dòng)的版本。Spring 5兼容Java?8和JDK 9,它集成了反應(yīng)式流,以方便后續(xù)提供一種顛覆性方法來實(shí)現(xiàn)端點(diǎn)和Web應(yīng)用程序開發(fā)。
當(dāng)然,反應(yīng)式編程不僅是此版本的主題,還是令許多程序員激動(dòng)不已的重大特性。人們對能夠針對負(fù)載波動(dòng)進(jìn)行無縫擴(kuò)展的容災(zāi)和響應(yīng)式服務(wù)的需求在不斷增加,Spring 5很好地滿足了這一需求。
下面介紹Java SE 8和Java EE 7 API升級的基本內(nèi)容、Spring 5的新反應(yīng)式編程模型、對HTTP/2的支持,以及Spring通過Kotlin對函數(shù)式編程的全面支持。還會簡要介紹測試和性能增強(qiáng),最后介紹對Spring核心和容器的一般性修訂。
升級到Java SE 8和Java EE 7
以前的Spring一直在支持一些棄用的Java版本,而Spring 5已從“舊包袱”中解放出來。為了充分利用Java 8的特性,它的代碼庫已進(jìn)行了改進(jìn),而且要求將Java 8作為最低的JDK版本。
Spring 5在類路徑(和模塊路徑)上完全兼容Java 9,而且它通過了JDK 9測試套件的測試。對Java 9愛好者而言,這是一個(gè)好消息。
在API級別上,Spring 5兼容Java EE 8技術(shù),滿足對Servlet 4.0、Bean Validation 2.0和全新的JSON Binding API的需求。對Java EE API的最低要求為V7,該版本引入了針對Servlet、JPA和Bean Validation API的次要版本。
反應(yīng)式編程模型
Spring 5最令人興奮的新特性是它的反應(yīng)式編程模型。Spring 5基于一種反應(yīng)式基礎(chǔ)而構(gòu)建,而且是完全異步和非阻塞的。只需少量的線程,新的事件循環(huán)執(zhí)行模型就可以垂直擴(kuò)展。
Spring 5采用反應(yīng)式流來提供在反應(yīng)式組件中傳播負(fù)壓的機(jī)制。負(fù)壓是一個(gè)確保來自多個(gè)生產(chǎn)者的數(shù)據(jù)不會讓使用者不堪重負(fù)的概念。
Spring WebFlux是Spring 5的反應(yīng)式核心,它為開發(fā)人員提供了兩種為Spring Web編程而設(shè)計(jì)的編程模型:基于注解的模型和Functional WebFramework(WebFlux.fn)。
基于注解的模型是Spring Web MVC的現(xiàn)代替代方案,該模型基于反應(yīng)式基礎(chǔ)而構(gòu)建,而Functional Web Framework是基于@Controller注解的編程模型的替代方案。這些模型都通過同一種反應(yīng)式規(guī)則來運(yùn)行,后者調(diào)整非阻塞HTTP來適應(yīng)反應(yīng)式流API。
使用注解進(jìn)行編程
Web MVC程序員應(yīng)該對Spring 5的基于注解的編程模型非常熟悉,Spring 5調(diào)整了Web MVC的@Controller編程模型,采用了相同的注解。
在下面的代碼中BookController類提供了兩個(gè)方法,分別響應(yīng)針對某個(gè)圖書列表的HTTP請求,以及針對具有給定id的圖書的HTTP請求。請注意Mono和Flux等對象。這些對象是實(shí)現(xiàn)反應(yīng)式流規(guī)范中的Publisher接口的反應(yīng)式類型,它們的職責(zé)是處理數(shù)據(jù)流。Mono對象處理一個(gè)僅含1個(gè)元素的流,而Flux表示一個(gè)包含N個(gè)元素的流。
@RestController public class BookController { //反應(yīng)式控制器 @GetMapping("/book") Fluxlist() { returnthis.repository.findAll(); } @GetMapping("/book/{id}") Mono findById(@PathVariable String id) { returnthis.repository.findOne(id); } }
以上是針對Spring Web編程的注解,下面我們使用函數(shù)式Web框架來解決同一個(gè)問題。
函數(shù)式編程
Spring 5的函數(shù)式方法將請求委托給處理函數(shù),這些函數(shù)接收一個(gè)服務(wù)器請求實(shí)例并返回一種反應(yīng)式類型。來看一段代碼,創(chuàng)建BookHandler類,其中l(wèi)istBooks()和getBook()方法相當(dāng)于Controller中的功能。
publicclassBookHandler { public MonolistBooks(ServerRequest request) { return ServerResponse.ok() .contentType(APPLICATION_JSON) .body(repository.allPeople(), Book.class); } public Mono getBook(ServerRequest request) { return repository.getBook(request.pathVariable("id")) .then(book -> ServerResponse.ok() .contentType(APPLICATION_JSON) .body(fromObject(book))) .otherwiseIfEmpty(ServerResponse.notFound().build()); } }
通過路由函數(shù)來匹配HTTP請求參數(shù)與媒體類型,將客戶端請求路由到處理函數(shù)。下面的代碼展示了圖書資源端點(diǎn)URI將調(diào)用委托給合適的處理函數(shù):
BookHandler handler = new BookHandler(); RouterFunctionpersonRoute = route( GET("/books/{id}") .and(accept(APPLICATION_JSON)), handler::getBook) .andRoute( GET("/books") .and(accept(APPLICATION_JSON)), handler::listBooks);
這些示例背后的數(shù)據(jù)存儲也支持完整的反應(yīng)式體驗(yàn),該體驗(yàn)是通過Spring Data對反應(yīng)式 Couchbase、Reactive MongoDB和Cassandra的支持來實(shí)現(xiàn)的。
使用 REST 端點(diǎn)執(zhí)行反應(yīng)式編程
新的編程模型脫離了傳統(tǒng)的Spring Web MVC模型,引入了一些很不錯(cuò)的新特性。
舉例來說,WebFlux模塊為RestTemplate提供了一種完全非阻塞、反應(yīng)式的替代方案,名為WebClient。下面創(chuàng)建一個(gè)WebClient,并調(diào)用books端點(diǎn)來請求一本給定id為1234的圖書。
//通過WebClient調(diào)用REST端點(diǎn) Monobook =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提高了傳輸性能,減少了延遲,并提高了應(yīng)用程序的吞吐量,從而提供了豐富的Web體驗(yàn)。
Spring 5提供專門的HTTP/2特性支持,還支持人們期望出現(xiàn)在JDK 9中的新HTTP客戶端。盡管HTTP/2的服務(wù)器推送功能已通過Jetty Servlet引擎的ServerPushFilter類向Spring開發(fā)人員公開很長一段時(shí)間了,但如果發(fā)現(xiàn)Spring 5中開箱即用地提供了HTTP/2性能增強(qiáng),Web優(yōu)化者們一定會為此歡呼雀躍。
Spring 5.1提供Servlet 4.0,HTTP/2新特性將由Tomcat 9.0、Jetty9.3和Undertow 1.4原生提供。
Kotlin和Spring WebFlux
Kotlin是一種來自JetBrains的面向?qū)ο笳Z言,支持函數(shù)式編程。它的主要優(yōu)勢之一是與Java有非常高的互操作性。通過引入對Kotlin的專門支持,Spring 5全面吸納了這一優(yōu)勢。它的函數(shù)式編程風(fēng)格與Spring WebFlux模塊完美匹配,它的新路由DSL利用了函數(shù)式Web框架及干凈且符合語言習(xí)慣的代碼。可以像下面代碼中這樣簡單地表達(dá)端點(diǎn)路由:
//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í),還添加了對Kotlin的不可變類的支持(通過帶默認(rèn)值的可選參數(shù)),以及對完全支持null的API的支持。
使用Lambda表達(dá)式注冊Bean
作為傳統(tǒng)XML和JavaConfig的替代方案,現(xiàn)在可以使用Lambda表達(dá)式注冊Spring Bean,使Bean可以實(shí)際注冊為提供者。下面代碼中使用Lambda表達(dá)式注冊了一個(gè)Book Bean:
GenericApplicationContext context = newGenericApplicationContext(); context.registerBean(Book.class, () ->new Book(context.getBean(Author.class)) );
Spring Web MVC支持最新的 API
全新的WebFlux模塊提供了許多新的、令人興奮的功能,但Spring 5也迎合了愿意繼續(xù)使用 Spring MVC的開發(fā)人員的需求。Spring 5中更新了“模型-視圖-控制器”框架,以兼容WebFlux和最新版的Jackson 2.9和Protobuf 3.0,甚至包括對新的Java EE 8 JSON-Binding API的支持。
除了HTTP/2特性的基礎(chǔ)服務(wù)器實(shí)現(xiàn),Spring Web MVC還通過MVC控制器方法的一個(gè)參數(shù)來支持Servlet 4.0 的PushBuilder。最后,Web MVC全面支持Reactor 3.1的Flux和Mono對象,以及RxJava 1.3和RxJava 2.1,它們被視為來自MVC控制器方法的返回值。這項(xiàng)支持的最終目的是支持Spring Data中新的反應(yīng)式WebClient和反應(yīng)式存儲庫。
使用JUnit 5執(zhí)行條件和并發(fā)測試
1. JUnit和Spring 5
Spring5全面接納了函數(shù)式范例,并支持JUnit5及其新的函數(shù)式測試風(fēng)格。還提供了對JUnit 4的向后兼容性,以確保不會破壞舊代碼。
Spring5的測試套件通過多種方式得到了增強(qiáng),但最明顯的是它對JUnit 5的支持?,F(xiàn)在可以在單元測試中利用Java 8中提供的函數(shù)式編程特性。以下代碼演示了這一支持:
@Test void givenStreamOfInts_SumShouldBeMoreThanFive() { assertTrue(Stream.of(20, 40, 50) .stream() .mapToInt(i -> i) .sum() > 110, () -> "Total should be more than 100"); }
2. 遷移到JUnit 5
如果你對升級到JUnit 5持觀望態(tài)度,StevePerry的分兩部分的深入剖析教程將說服你進(jìn)行嘗試。
Spring5繼承了JUnit 5在Spring TestContext Framework內(nèi)實(shí)現(xiàn)多個(gè)擴(kuò)展API的靈活性。舉例,開發(fā)人員可以使用JUnit 5的條件測試執(zhí)行注解@EnabledIf和@DisabledIf來自動(dòng)計(jì)算一個(gè)SpEL(Spring Expression Language)表達(dá)式,并適當(dāng)?shù)貑⒂没蚪脺y試。借助這些注解,Spring 5支持以前很難實(shí)現(xiàn)的復(fù)雜的條件測試方案。SpringTextContext Framework現(xiàn)在能夠并發(fā)執(zhí)行測試。
3. 使用 Spring WebFlux 執(zhí)行集成測試
Spring Test現(xiàn)在包含一個(gè)WebTestClient,后者支持對Spring WebFlux服務(wù)器端點(diǎn)執(zhí)行集成測試。WebTestClient使用模擬請求和響應(yīng)來避免耗盡服務(wù)器資源,并能直接綁定到WebFlux服務(wù)器的基礎(chǔ)架構(gòu)。
WebTestClient可綁定到真實(shí)的服務(wù)器,或者使用控制器或函數(shù)。在下面的代碼中,WebTestClient被綁定到localhost:
WebTestClient testClient = WebTestClient .bindToServer() .baseUrl("http://localhost:8080") .build();
下面的代碼將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();
包清理和棄用
Spring5終止了對一些過時(shí)API的支持。遭此厄運(yùn)的有Hibernate 3和Hibernate 4,為了支持Hibernate 5,它們遭到了棄用。另外,對Portlet、Velocity、JasperReports、XMLBeans、JDO和Guava的支持也已終止。
包級別上的清理工作仍在繼續(xù)。Spring 5不再支持beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(來自spring-aspects模塊)或web.view.tiles2M。Tiles 3現(xiàn)在是Spring的最低要求。
Spring核心和容器的一般更新
Spring 5改進(jìn)了掃描和識別組件的方法,使大型項(xiàng)目的性能得到提升。目前,掃描是在編譯時(shí)執(zhí)行的,而且向META-INF/spring.components文件中的索引文件添加了組件坐標(biāo)。該索引是通過一個(gè)為項(xiàng)目定義的特定于平臺的應(yīng)用程序構(gòu)建任務(wù)來生成的。
標(biāo)有來自javax包的注解的組件會添加到索引中,任何帶@Index注解的類或接口都會添加到索引中。Spring的傳統(tǒng)類路徑掃描方式?jīng)]有被刪除,而是保留下來作為一種后備選擇。有許多針對大型代碼庫的明顯性能優(yōu)勢,托管許多Spring項(xiàng)目的服務(wù)器也會縮短啟動(dòng)時(shí)間。
Spring 5還添加了對@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橋接器?,F(xiàn)在已通過資源抽象支持防御性編程,為getFile訪問提供了isFile指示器。
Spring 5的首要特性是新的反應(yīng)式編程模型,這代表著對提供可無縫擴(kuò)展、基于Spring的響應(yīng)式服務(wù)的重大保障。隨著人們對Spring 5的采用,反應(yīng)式編程有望成為使用Java語言的Web和企業(yè)應(yīng)用程序開發(fā)的未來。
以上就是Spring 5的新特性有哪些呢,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。