偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

我這樣回答了Spring 5的新特性,面試官對(duì)我刮目相看

開(kāi)發(fā) 后端
最近,有一個(gè)小伙伴拿到了自己滿意的Offer,和他交談的過(guò)程中得知他面試官問(wèn)他關(guān)于Spring的問(wèn)題比較多,其中最讓面試官滿意的就是自己回答關(guān)于Spring 5的知識(shí)點(diǎn)回答的不錯(cuò)。

 

最近,有一個(gè)小伙伴拿到了自己滿意的Offer,和他交談的過(guò)程中得知他面試官問(wèn)他關(guān)于Spring的問(wèn)題比較多,其中最讓面試官滿意的就是自己回答關(guān)于Spring 5的知識(shí)點(diǎn)回答的不錯(cuò)。

Spring5是2017年9月發(fā)布的,現(xiàn)在已經(jīng)將近兩年的時(shí)間了,很多人可能還不知道他到底有哪些特性,恰好最近看了一本書(shū)《Spring 5 核心原理與30個(gè)類(lèi)手寫(xiě)實(shí)戰(zhàn)》,覺(jué)得里面的內(nèi)容不錯(cuò),經(jīng)作者授權(quán),節(jié)選其中部分內(nèi)容,介紹下關(guān)于Spring 5的新特性,這本書(shū)我在文末也會(huì)送出5本。

Spring5于2017年9月發(fā)布了通用版本,它是自2013年12月以來(lái)第一個(gè)主要的Spring版本。它提供了一些人們期待已久的改進(jìn),還采用了一種全新的編程范例,以反應(yīng)式原則為基礎(chǔ)。

這個(gè)版本是很長(zhǎng)時(shí)間以來(lái)最令人激動(dòng)的版本。Spring 5兼容Java™8和JDK 9,它集成了反應(yīng)式流,以方便后續(xù)提供一種顛覆性方法來(lái)實(shí)現(xiàn)端點(diǎn)和Web應(yīng)用程序開(kāi)發(fā)。

當(dāng)然,反應(yīng)式編程不僅是此版本的主題,還是令許多程序員激動(dòng)不已的重大特性。人們對(duì)能夠針對(duì)負(fù)載波動(dòng)進(jìn)行無(wú)縫擴(kuò)展的容災(zāi)和響應(yīng)式服務(wù)的需求在不斷增加,Spring 5很好地滿足了這一需求。

下面介紹Java SE 8和Java EE 7 API升級(jí)的基本內(nèi)容、Spring 5的新反應(yīng)式編程模型、對(duì)HTTP/2的支持,以及Spring通過(guò)Kotlin對(duì)函數(shù)式編程的全面支持。還會(huì)簡(jiǎn)要介紹測(cè)試和性能增強(qiáng),最后介紹對(duì)Spring核心和容器的一般性修訂。

升級(jí)到Java SE 8和Java EE 7

以前的Spring一直在支持一些棄用的Java版本,而Spring 5已從“舊包袱”中解放出來(lái)。為了充分利用Java 8的特性,它的代碼庫(kù)已進(jìn)行了改進(jìn),而且要求將Java 8作為最低的JDK版本。

Spring 5在類(lèi)路徑(和模塊路徑)上完全兼容Java 9,而且它通過(guò)了JDK 9測(cè)試套件的測(cè)試。對(duì)Java 9愛(ài)好者而言,這是一個(gè)好消息。

在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基于一種反應(yīng)式基礎(chǔ)而構(gòu)建,而且是完全異步和非阻塞的。只需少量的線程,新的事件循環(huán)執(zhí)行模型就可以垂直擴(kuò)展。

Spring 5采用反應(yīng)式流來(lái)提供在反應(yīng)式組件中傳播負(fù)壓的機(jī)制。負(fù)壓是一個(gè)確保來(lái)自多個(gè)生產(chǎn)者的數(shù)據(jù)不會(huì)讓使用者不堪重負(fù)的概念。

Spring WebFlux是Spring 5的反應(yīng)式核心,它為開(kāi)發(fā)人員提供了兩種為Spring Web編程而設(shè)計(jì)的編程模型:基于注解的模型和Functional WebFramework(WebFlux.fn)。

基于注解的模型是Spring Web MVC的現(xiàn)代替代方案,該模型基于反應(yīng)式基礎(chǔ)而構(gòu)建,而Functional Web Framework是基于@Controller注解的編程模型的替代方案。這些模型都通過(guò)同一種反應(yīng)式規(guī)則來(lái)運(yùn)行,后者調(diào)整非阻塞HTTP來(lái)適應(yīng)反應(yīng)式流API。

使用注解進(jìn)行編程

Web MVC程序員應(yīng)該對(duì)Spring 5的基于注解的編程模型非常熟悉,Spring 5調(diào)整了Web MVC的@Controller編程模型,采用了相同的注解。

在下面的代碼中BookController類(lèi)提供了兩個(gè)方法,分別響應(yīng)針對(duì)某個(gè)圖書(shū)列表的HTTP請(qǐng)求,以及針對(duì)具有給定id的圖書(shū)的HTTP請(qǐng)求。請(qǐng)注意Mono和Flux等對(duì)象。這些對(duì)象是實(shí)現(xiàn)反應(yīng)式流規(guī)范中的Publisher接口的反應(yīng)式類(lèi)型,它們的職責(zé)是處理數(shù)據(jù)流。Mono對(duì)象處理一個(gè)僅含1個(gè)元素的流,而Flux表示一個(gè)包含N個(gè)元素的流。 

  1. @RestController  
  2. public class BookController { //反應(yīng)式控制器  
  3.     @GetMapping("/book")  
  4.     Flux<Book> list() {  
  5.         returnthis.repository.findAll();  
  6.     }  
  7.     @GetMapping("/book/{id}")  
  8.     Mono<Book> findById(@PathVariable String id) {  
  9.         returnthis.repository.findOne(id);  
  10.     }  

以上是針對(duì)Spring Web編程的注解,下面我們使用函數(shù)式Web框架來(lái)解決同一個(gè)問(wèn)題。

函數(shù)式編程

Spring 5的函數(shù)式方法將請(qǐng)求委托給處理函數(shù),這些函數(shù)接收一個(gè)服務(wù)器請(qǐng)求實(shí)例并返回一種反應(yīng)式類(lèi)型。來(lái)看一段代碼,創(chuàng)建BookHandler類(lèi),其中l(wèi)istBooks()和getBook()方法相當(dāng)于Controller中的功能。 

  1. publicclassBookHandler {  
  2. public Mono<ServerResponse> listBooks(ServerRequest request) {  
  3.     return ServerResponse.ok()  
  4.         .contentType(APPLICATION_JSON)  
  5.         .body(repository.allPeople(), Book.class);  
  6.  
  7. public Mono<ServerResponse> getBook(ServerRequest request) {  
  8. return repository.getBook(request.pathVariable("id"))  
  9.     .then(book -> ServerResponse.ok()  
  10.     .contentType(APPLICATION_JSON)  
  11.     .body(fromObject(book)))  
  12.     .otherwiseIfEmpty(ServerResponse.notFound().build());  
  13.     }  

通過(guò)路由函數(shù)來(lái)匹配HTTP請(qǐng)求參數(shù)與媒體類(lèi)型,將客戶端請(qǐng)求路由到處理函數(shù)。下面的代碼展示了圖書(shū)資源端點(diǎn)URI將調(diào)用委托給合適的處理函數(shù): 

  1. BookHandler handler = new BookHandler();  
  2. RouterFunction<ServerResponse> personRoute =  
  3.         route 
  4.                 GET("/books/{id}")  
  5.                         .and(accept(APPLICATION_JSON)), handler::getBook)  
  6.                 .andRoute(  
  7.                         GET("/books")  
  8.                                 .and(accept(APPLICATION_JSON)), handler::listBooks); 

這些示例背后的數(shù)據(jù)存儲(chǔ)也支持完整的反應(yīng)式體驗(yàn),該體驗(yàn)是通過(guò)Spring Data對(duì)反應(yīng)式 Couchbase、Reactive MongoDB和Cassandra的支持來(lái)實(shí)現(xiàn)的。

使用 REST 端點(diǎn)執(zhí)行反應(yīng)式編程

新的編程模型脫離了傳統(tǒng)的Spring Web MVC模型,引入了一些很不錯(cuò)的新特性。

舉例來(lái)說(shuō),WebFlux模塊為RestTemplate提供了一種完全非阻塞、反應(yīng)式的替代方案,名為WebClient。下面創(chuàng)建一個(gè)WebClient,并調(diào)用books端點(diǎn)來(lái)請(qǐng)求一本給定id為1234的圖書(shū)。 

  1. //通過(guò)WebClient調(diào)用REST端點(diǎn)  
  2. Mono<Book> book =WebClient.create("http://localhost:8080")  
  3.        .get()  
  4.        .url("/books/{id}", 1234)  
  5.        .accept(APPLICATION_JSON)  
  6.        .exchange(request)  
  7.        .then(response -> response.bodyToMono(Book.class)); 

支持HTTP/2

HTTP/2提高了傳輸性能,減少了延遲,并提高了應(yīng)用程序的吞吐量,從而提供了豐富的Web體驗(yàn)。

Spring 5提供專門(mén)的HTTP/2特性支持,還支持人們期望出現(xiàn)在JDK 9中的新HTTP客戶端。盡管HTTP/2的服務(wù)器推送功能已通過(guò)Jetty Servlet引擎的ServerPushFilter類(lèi)向Spring開(kāi)發(fā)人員公開(kāi)很長(zhǎng)一段時(shí)間了,但如果發(fā)現(xiàn)Spring 5中開(kāi)箱即用地提供了HTTP/2性能增強(qiáng),Web優(yōu)化者們一定會(huì)為此歡呼雀躍。

Spring 5.1提供Servlet 4.0,HTTP/2新特性將由Tomcat 9.0、Jetty9.3和Undertow 1.4原生提供。

Kotlin和Spring WebFlux

Kotlin是一種來(lái)自JetBrains的面向?qū)ο笳Z(yǔ)言,支持函數(shù)式編程。它的主要優(yōu)勢(shì)之一是與Java有非常高的互操作性。通過(guò)引入對(duì)Kotlin的專門(mén)支持,Spring 5全面吸納了這一優(yōu)勢(shì)。它的函數(shù)式編程風(fēng)格與Spring WebFlux模塊完美匹配,它的新路由DSL利用了函數(shù)式Web框架及干凈且符合語(yǔ)言習(xí)慣的代碼??梢韵裣旅娲a中這樣簡(jiǎn)單地表達(dá)端點(diǎn)路由: 

  1. //Kotlin用于定義端點(diǎn)的路由DSL  
  2. @Bean  
  3. fun apiRouter() = router {  
  4.    (accept(APPLICATION_JSON) and "/api").nest {  
  5.        "/book".nest {  
  6.            GET("/", bookHandler::findAll)  
  7.            GET("/{id}", bookHandler::findOne)  
  8.         }  
  9.        "/video".nest {  
  10.            GET("/", videoHandler::findAll)  
  11.            GET("/{genre}", videoHandler::findByGenre)  
  12.         }  
  13.     }  

使用Kotlin 1.1.4以上版本時(shí),還添加了對(duì)Kotlin的不可變類(lèi)的支持(通過(guò)帶默認(rèn)值的可選參數(shù)),以及對(duì)完全支持null的API的支持。

使用Lambda表達(dá)式注冊(cè)Bean

作為傳統(tǒng)XML和JavaConfig的替代方案,現(xiàn)在可以使用Lambda表達(dá)式注冊(cè)Spring Bean,使Bean可以實(shí)際注冊(cè)為提供者。下面代碼中使用Lambda表達(dá)式注冊(cè)了一個(gè)Book Bean: 

  1. GenericApplicationContext context = newGenericApplicationContext();  
  2. context.registerBean(Book.class, () ->new  
  3.        Book(context.getBean(Author.class))  
  4. ); 

Spring Web MVC支持最新的 API

全新的WebFlux模塊提供了許多新的、令人興奮的功能,但Spring 5也迎合了愿意繼續(xù)使用 Spring MVC的開(kāi)發(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 Web MVC還通過(guò)MVC控制器方法的一個(gè)參數(shù)來(lái)支持Servlet 4.0 的PushBuilder。最后,Web MVC全面支持Reactor 3.1的Flux和Mono對(duì)象,以及RxJava 1.3和RxJava 2.1,它們被視為來(lái)自MVC控制器方法的返回值。這項(xiàng)支持的最終目的是支持Spring Data中新的反應(yīng)式WebClient和反應(yīng)式存儲(chǔ)庫(kù)。

使用JUnit 5執(zhí)行條件和并發(fā)測(cè)試

1. JUnit和Spring 5

Spring5全面接納了函數(shù)式范例,并支持JUnit5及其新的函數(shù)式測(cè)試風(fēng)格。還提供了對(duì)JUnit 4的向后兼容性,以確保不會(huì)破壞舊代碼。

Spring5的測(cè)試套件通過(guò)多種方式得到了增強(qiáng),但最明顯的是它對(duì)JUnit 5的支持?,F(xiàn)在可以在單元測(cè)試中利用Java 8中提供的函數(shù)式編程特性。以下代碼演示了這一支持: 

  1. @Test  
  2. void givenStreamOfInts_SumShouldBeMoreThanFive() {  
  3.     assertTrue(Stream.of(20, 40, 50)  
  4.             .stream()  
  5.             .mapToInt(i -> i)  
  6.             .sum() > 110, () -> "Total should be more than 100");  

2. 遷移到JUnit 5

如果你對(duì)升級(jí)到JUnit 5持觀望態(tài)度,StevePerry的分兩部分的深入剖析教程將說(shuō)服你進(jìn)行嘗試。

Spring5繼承了JUnit 5在Spring TestContext Framework內(nèi)實(shí)現(xiàn)多個(gè)擴(kuò)展API的靈活性。舉例,開(kāi)發(fā)人員可以使用JUnit 5的條件測(cè)試執(zhí)行注解@EnabledIf和@DisabledIf來(lái)自動(dòng)計(jì)算一個(gè)SpEL(Spring Expression Language)表達(dá)式,并適當(dāng)?shù)貑⒂没蚪脺y(cè)試。借助這些注解,Spring 5支持以前很難實(shí)現(xiàn)的復(fù)雜的條件測(cè)試方案。SpringTextContext Framework現(xiàn)在能夠并發(fā)執(zhí)行測(cè)試。

3. 使用 Spring WebFlux 執(zhí)行集成測(cè)試

Spring Test現(xiàn)在包含一個(gè)WebTestClient,后者支持對(duì)Spring WebFlux服務(wù)器端點(diǎn)執(zhí)行集成測(cè)試。WebTestClient使用模擬請(qǐng)求和響應(yīng)來(lái)避免耗盡服務(wù)器資源,并能直接綁定到WebFlux服務(wù)器的基礎(chǔ)架構(gòu)。

WebTestClient可綁定到真實(shí)的服務(wù)器,或者使用控制器或函數(shù)。在下面的代碼中,WebTestClient被綁定到localhost: 

  1. WebTestClient testClient = WebTestClient  
  2.         .bindToServer()  
  3.         .baseUrl("http://localhost:8080")  
  4.         .build(); 

下面的代碼將WebTestClient綁定到RouterFunction: 

  1. RouterFunction bookRouter = RouterFunctions.route(  
  2.         RequestPredicates.GET("/books"),  
  3.         request -> ServerResponse.ok().build()  
  4. );  
  5. WebTestClient  
  6.         .bindToRouterFunction(bookRouter)  
  7.         .build().get().uri("/books")  
  8.         .exchange()  
  9.         .expectStatus().isOk()  
  10.         .expectBody().isEmpty(); 

包清理和棄用

Spring5終止了對(duì)一些過(guò)時(shí)API的支持。遭此厄運(yùn)的有Hibernate 3和Hibernate 4,為了支持Hibernate 5,它們?cè)獾搅藯売?。另外,?duì)Portlet、Velocity、JasperReports、XMLBeans、JDO和Guava的支持也已終止。

包級(jí)別上的清理工作仍在繼續(xù)。Spring 5不再支持beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(來(lái)自spring-aspects模塊)或web.view.tiles2M。Tiles 3現(xiàn)在是Spring的最低要求。

Spring核心和容器的一般更新

Spring 5改進(jìn)了掃描和識(shí)別組件的方法,使大型項(xiàng)目的性能得到提升。目前,掃描是在編譯時(shí)執(zhí)行的,而且向META-INF/spring.components文件中的索引文件添加了組件坐標(biāo)。該索引是通過(guò)一個(gè)為項(xiàng)目定義的特定于平臺(tái)的應(yīng)用程序構(gòu)建任務(wù)來(lái)生成的。

標(biāo)有來(lái)自javax包的注解的組件會(huì)添加到索引中,任何帶@Index注解的類(lèi)或接口都會(huì)添加到索引中。Spring的傳統(tǒng)類(lèi)路徑掃描方式?jīng)]有被刪除,而是保留下來(lái)作為一種后備選擇。有許多針對(duì)大型代碼庫(kù)的明顯性能優(yōu)勢(shì),托管許多Spring項(xiàng)目的服務(wù)器也會(huì)縮短啟動(dòng)時(shí)間。

Spring 5還添加了對(duì)@Nullable的支持,后者可用于指示可選的注入點(diǎn)。使用者現(xiàn)在必須準(zhǔn)備接受null值。此外,還可以使用此注解來(lái)標(biāo)記可以為null的參數(shù)、字段和返回值。@Nullable主要用于IntelliJ IDEA等IDE,但也可用于Eclipse和FindBugs,它使得在編譯時(shí)處理null值變得更方便,無(wú)須在運(yùn)行時(shí)發(fā)送NullPointerExceptions。

Spring Logging還提升了性能,自帶開(kāi)箱即用的Commons Logging橋接器?,F(xiàn)在已通過(guò)資源抽象支持防御性編程,為getFile訪問(wèn)提供了isFile指示器。

我如何看Spring 5

Spring 5的首要特性是新的反應(yīng)式編程模型,這代表著對(duì)提供可無(wú)縫擴(kuò)展、基于Spring的響應(yīng)式服務(wù)的重大保障。隨著人們對(duì)Spring 5的采用,反應(yīng)式編程有望成為使用Java語(yǔ)言的Web和企業(yè)應(yīng)用程序開(kāi)發(fā)的未來(lái)。

未來(lái)的Spring將繼續(xù)體現(xiàn)這一承諾,因?yàn)镾pringSecurity、Spring Data和Spring Integration有望采用反應(yīng)式編程的特征和優(yōu)勢(shì)。

總之,Spring 5代表著一次大受Spring開(kāi)發(fā)人員歡迎的華麗轉(zhuǎn)變,同時(shí)也為其他框架指出了一條發(fā)展之路。Spring 5的升級(jí)也為Spring Boot、Spring Cloud提供了非常豐富的經(jīng)驗(yàn),Spring不只是一個(gè)框架,已然成了一個(gè)編程生態(tài)。 

 

責(zé)任編輯:龐桂玉 來(lái)源: Hollis
相關(guān)推薦

2019-05-14 08:44:13

面試面試官線程安全

2023-01-09 08:09:07

Spring項(xiàng)目模式

2020-12-01 11:50:49

數(shù)據(jù)庫(kù)Redis面試

2022-04-19 07:31:28

事務(wù)隔離機(jī)制數(shù)據(jù)庫(kù)

2022-10-09 08:38:17

消息隊(duì)列面試官模式

2020-12-10 08:43:17

垃圾回收JVM

2021-03-24 10:25:24

優(yōu)化VUE性能

2024-12-10 07:10:00

2021-12-02 08:19:06

MVCC面試數(shù)據(jù)庫(kù)

2021-09-28 13:42:55

Chrome Devwebsocket網(wǎng)絡(luò)協(xié)議

2020-07-02 07:52:11

RedisHash映射

2024-06-26 11:55:44

2022-04-10 18:10:24

CURD鏈表

2019-07-15 16:35:43

MySQL索引阿里

2020-09-17 17:53:12

面試ArrayList數(shù)組

2020-09-08 06:43:53

B+樹(shù)面試索引

2020-08-13 10:15:34

MySQL數(shù)據(jù)庫(kù)面試

2025-03-28 08:53:51

2024-03-05 07:31:59

CASvalue原子性

2020-07-20 07:48:53

單例模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)