簡單了解Spring Framework5.0新特性
SpringFramework5.0是自2013年12月版本4發(fā)布之后SpringFramework的第一個主發(fā)行版。SpringFramework項目的領(lǐng)導(dǎo)人JuergenHoeller于2016年7月28日宣布了第一個SpringFramework5.0里程碑版本(5.0M1)。
現(xiàn)在,將近一年的時間過去以后,我們期盼已久的RC3版本將于2017年7月18日發(fā)行。這是路線圖規(guī)劃中SpringFramework5.0首個GA發(fā)行版的最后一次發(fā)行。
從高層來看,SpringFramework5.0的功能可以分為:
JDK基線更新
核心框架修正
核心容器更新
含Kotlin在內(nèi)的函數(shù)式編程
響應(yīng)式編程模型
測試改進
庫支持
中止支持
SpringFramework5.0的JDK基線更新
整個Springframework5.0代碼庫運行于Java8之上。因此SpringFramework5.0對環(huán)境的最低要就就是Java8。
這一點實際上對框架而言非常重要。而作為開發(fā)者的我們而言,則已經(jīng)能夠去藉此來享受到現(xiàn)代Java發(fā)行版中的所有新特性了。而框架版本還背負(fù)這支持已經(jīng)不被建議使用的Java發(fā)行版的任務(wù)。
現(xiàn)在,框架的最低要求是Java8.
SpringFramework5.0原來是計劃在Java9之上發(fā)行的。然后,在基于Java9的發(fā)行版運作了超過18個月之后,Spring團隊決定將SpringFramework5.0發(fā)行版同Java9的綁定關(guān)系解除。
不過,在Java9發(fā)布的時候(計劃是2017年9月份),SpringFramework5.0會準(zhǔn)備好的。
核心框架修訂
核心的SpringFramework5.0已經(jīng)利用Java8所引入的新特性進行了修訂。比較關(guān)鍵的一些如下:
基于Java8的反射增強,SpringFramework5.0中的方法參數(shù)可以更加高效的進行訪問。
核心的Spring接口現(xiàn)在提供基于Java8的默認(rèn)方法構(gòu)建的選擇性聲明。
用@Nullable和@NotNull注解來顯示表明可為空的參數(shù)和以及返回值。這樣就夠在編譯的時候處理空值而不是在運行時拋出NullPointerExceptions。
在日志記錄方面,SpringFramework5.0帶來了CommonsLogging橋接模塊的封裝,它被叫做spring-jcl而不是標(biāo)準(zhǔn)的CommonsLogging。當(dāng)然,無需任何額外的橋接,新版本也會對Log4j2.x,SLF4J,JUL(java.util.logging)進行自動檢測。
有了Resourse抽象所提供的isFile指示器以及getFile方法,防御式編程方法也得到了框架的推動。
核心容器更新
SpringFramework5.0現(xiàn)在支持候選組件索引作為類路徑掃描的替代方案。該功能已經(jīng)在類路徑掃描器中添加,以簡化添加候選組件標(biāo)識的步驟。
應(yīng)用程序構(gòu)建任務(wù)可以定義當(dāng)前項目自己的META-INF/spring.components文件。在編譯時,源模型是自包含的,JPA實體和Spring組件是已被標(biāo)記的。
從索引讀取實體而不是掃描類路徑對于小于200個類的小型項目是沒有明顯差異。但對大型項目影響較大。加載組件索引開銷更低。因此,隨著類數(shù)的增加,索引讀取的啟動時間將保持不變。
加載組件索引的耗費是廉價的。因此當(dāng)類的數(shù)量不斷增長,加上構(gòu)建索引的啟動時間仍然可以維持一個常數(shù),不過對于組件掃描而言,啟動時間則會有明顯的增長。
這個對于我們處于大型Spring項目的開發(fā)者所意味著的,是應(yīng)用程序的啟動時間將被大大縮減。雖然20或者30秒鐘看似沒什么,但如果每天要這樣登上好幾百次,加起來就夠你受的了。使用了組件索引的話,就能幫助你每天過的更加高效。
你可以在Spring的Jira上了解更多關(guān)于組件索引的相關(guān)信息。
@Nullable注解現(xiàn)在也可以被用來作為可選注入項的指示器。@Nullable為對象使用方規(guī)定了一項義務(wù),就是它們必須準(zhǔn)備以為取值為null的值。在此次發(fā)布之前,實現(xiàn)這件事情的唯一方法就是通過Android的Nullable,CheckerFramework的Nullable,以及JSR305的Nullable。
發(fā)行說明中的其他一些新功能和增強功能包括:
在GenericApplicationContext和AnnotationConfigApplicationContext中實現(xiàn)函數(shù)式編程風(fēng)格。
對接口方法的事務(wù)、緩存和異步注釋的一致性檢測。
將XML配置命名空間簡化為無版本化的模式。
使用Kotlin進行函數(shù)式編程
SpringFramework5.0引入了對JetBrainsKotlin語言的支持。Kotlin是一種支持函數(shù)式編程編程風(fēng)格的面向?qū)ο笳Z言。Kotlin運行在JVM之上,但運行環(huán)境并不限于JVM。
有了對Kotlin的支持,開發(fā)者可以進行深度的函數(shù)式Spring編程,特別是在函數(shù)式Web端點以及Bean注冊這些方面。
在SpringFramework5.0中,你可以為WEB的函數(shù)式API編寫干凈且地道的Kotlin代碼,就像下面這樣:
{ ("/movie" and accept(TEXT_HTML)).nest { GET("/", movieHandler::findAllView) GET("/{card}", movieHandler::findOneView) } ("/api/movie" and accept(APPLICATION_JSON)).nest { GET("/", movieApiHandler::findAll) GET("/{id}", movieApiHandler::findOne) } }
對于 Bean 的注冊,作為 XML 或者 @Configuration 以及 @Bean 的替代辦法, 現(xiàn)在你可以使用 Kotlin 來注冊 Spring Bean了,就像下面這樣:
val context = GenericApplicationContext { registerBean() registerBean { Cinema(it.getBean()) } }
響應(yīng)式編程模型
此次Spring發(fā)行版本的一個激動人心的特性就是新的響應(yīng)式堆棧WEB框架。這個堆棧完全的響應(yīng)式且非阻塞,適合于事件循環(huán)風(fēng)格的處理,可以進行少量線程的擴展。
ReactiveStreams是來自于Netflix,Pivotal,Typesafe,RedHat,Oracle,Twitter以及Spray.io的工程師特地開發(fā)的一個API。它為響應(yīng)式編程實現(xiàn)的實現(xiàn)提供一個公共的API,好實現(xiàn)Hibernate的JPA。這里JPA就是這個API,而Hibernate就是實現(xiàn)。
ReactiveStreamsAPI是Java9的官方版本的一部分。在Java8中,你會需要專門引入依賴來使用ReactiveStreamsAPI。
SpringFramework5.0對于流式處理的支持依賴于ProjectReactor來構(gòu)建,其專門實現(xiàn)了ReactiveStreamsAPI。
SpringFramework5.0擁有一個新的spring-webflux模塊,支持響應(yīng)式HTTP和WebSocket客戶端。SpringFramework5.0還提供了對于運行于服務(wù)器之上,包含了REST,HTML,以及WebSocket風(fēng)格交互的響應(yīng)式網(wǎng)頁應(yīng)用程序的支持。
在spring-webflux中包含了兩種獨立的服務(wù)端編程模型:
基于注解:使用到了@Controller以及SpringMVC的其它一些注解;
使用Java8lambda表達(dá)式的函數(shù)式風(fēng)格的路由和處理。
有了SpringWebflux,你現(xiàn)在可以創(chuàng)建出WebClient,它是響應(yīng)式且非阻塞的,可以作為RestTemplate的一個替代方案。
這里有一個使用Spring5.0的REST端點的WebClient實現(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模塊給我么帶來了激動人心的新能力,傳統(tǒng)的SpringMVC在SpringFramework5.0仍然得到了完整的支持。
測試方面的提升
SpringFramework5.0完全支持JUnit5Jupiter,所以可以使用JUnit5來編寫測試以及擴展。此外還提供了一個編程以及擴展模型,Jupiter子項目提供了一個測試引擎來在Spring上運行基于Jupiter的測試。
另外,SpringFramework5還提供了在SpringTestContextFramework中進行并行測試的擴展。
針對響應(yīng)式編程模型,spring-test現(xiàn)在還引入了支持SpringWebFlux的WebTestClient集成測試的支持,類似于MockMvc,并不需要一個運行著的服務(wù)端。使用一個模擬的請求或者響應(yīng),WebTestClient就可以直接綁定到WebFlux服務(wù)端設(shè)施。
你可以在這里找到這個激動人心的TestContext框架所帶來的增強功能的完整列表。
當(dāng)然,SpringFramework5.0仍然支持我們的老朋友JUnit!在我寫這篇文章的時候,JUnit5還只是發(fā)展到了GA版本。對于JUnit4,SpringFramework在未來還是要支持一段時間的。
庫支持
SpringFramework5.0目前支持以下升級庫的版本:
Jackson2.6+
EhCache2.10+/3.0GA
Hibernate5.0+
JDBC4.0+
XmlUnit2.x+
OkHttp3.x+
Netty4.1+
中止的支持
在API層面,SpringFramework5.0不再支持以下包:
beans.factory.access
jdbc.support.nativejdbc
spring-aspects模塊的mock.staticmock
web.view.tiles2M.(最低要求Tiles3)
orm.hibernate3和orm.hibernate4.目前Hibernate5是支持的框架。
SpringFramework5.0同時也停止了對以下庫的支持:
Portlet.
Velocity.
JasperReports.
XMLBeans.
JDO.
Guava.
如果你正在使用任何上面的包,建議你將SpringFramework版本維持在4.3.x。
結(jié)語
SpringFramework5.0的亮點絕對是響應(yīng)式編程,這是一個重要的范式轉(zhuǎn)變。你可以將SpringFramework5.0作為響應(yīng)式程序的基礎(chǔ)版本。對于2017年及以后的剩余時間里,你可以期待看到子項目實現(xiàn)響應(yīng)式特性。你將看到即將發(fā)布的SpringData、SpringSecurity、SpringIntegration等版本所提供的響應(yīng)式編程功能。
SpringData團隊已經(jīng)為MongoDB和Redis實現(xiàn)了響應(yīng)式支持。
使用JDBC獲取響應(yīng)式支持還為時過早。JDBC規(guī)范本身就是阻塞的,在傳統(tǒng)的JDBC數(shù)據(jù)庫中看到響應(yīng)式編程的還需要一段時間。
雖然響應(yīng)式編程是SpringFramework5.0中的閃光點,但它不會在任何地方得到支持。下游技術(shù)需要提供響應(yīng)式支持。
隨著響應(yīng)式編程越來越受歡迎,我們可以期待越來越多的技術(shù)將實現(xiàn)響應(yīng)式解決方案。當(dāng)然,我們可以期待Spring框架隨著其他的響應(yīng)式編程方案的使用而發(fā)展
以上就是本文關(guān)于簡單了解Spring Framework5.0新特性的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Spring AOP攔截-三種方式實現(xiàn)自動代理詳解
如有不足之處,歡迎留言指出。
相關(guān)文章
IntelliJ IDEA安裝插件阿里巴巴Java開發(fā)手冊(Alibaba Java Coding Guidelines
這篇文章主要介紹了IntelliJ IDEA安裝插件阿里巴巴Java開發(fā)手冊(Alibaba Java Coding Guidelines),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05SpringMVC的處理器攔截器HandlerInterceptor詳解
這篇文章主要介紹了SpringMVC的處理器攔截器HandlerInterceptor詳解,SpringWebMVC的處理器攔截器,類似于Servlet開發(fā)中的過濾器Filter,用于處理器進行預(yù)處理和后處理,需要的朋友可以參考下2024-01-01關(guān)于@ApiModel和@ApiModelProperty的使用
這篇文章主要介紹了關(guān)于@ApiModel和@ApiModelProperty的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11MybatisPlusInterceptor依賴變紅如何解決,無法識別問題
這篇文章主要介紹了MybatisPlusInterceptor依賴變紅如何解決,無法識別問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析
這篇文章主要給大家介紹了關(guān)于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關(guān)資料,文中通過示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01