資訊中心

Spring框架5.0版本發布相關的技術訪談


作者:Amit K Gupta

Spring框架5.0版本在2017年9月28日發布,在特性中包含了一個新的反應式Web框架。Pivotal的產品市場主管Pieter Humphrey將這個版本描述為該項目自2004年誕生以來最重要的發布版本。

在這個發布版本中,Spring 5.0的整個代碼庫都是基于Java 8源碼級別的。Spring 5.0完全兼容JDK 9進行開發和部署。

Spring 5.0的反應式Web框架名為Spring WebFlux,它構建在Reactor 3.1項目之上,同時支持注解和函數式風格編程。InfoQ與Pivotal的高級工程師Rossen Stoyanchev進行了交流,討論了他對Spring 5.0強調反應式編程的看法。
Stoyanchev:通過Java 8的CompletableFuture,Java開發人員已經熟悉了采用連續(continuation)風格的API來組合異步邏輯的好處。在最近幾年間,我們看到出現了一些庫用于組合異步邏輯,比如RxJava和Reactor,它們提供了與CompletableFuture類似的收益,但它們處理的是流式值并且支持回壓(backpressure,在Reactive Streams規范中所定義的)。
Spring框架5.0版本借助一個Web框架,能夠讓應用擁抱這種異步編程模型,這個Web框架本身的核心協議是完全異步的,內部采用了非阻塞的I/O,在異步運行時環境上支持Reactive Streams回壓功能,這些運行時環境包括Netty、Undertow以及像Tomcat和Jetty這樣的Servlet容器(基于Servlet 3.1非阻塞I/O)。這種方式所帶來的最重要的好處就是能夠結合事件輪詢風格的執行模型來組合異步邏輯,這樣就能以更少的硬件資源處理更多的并發請求,在高負載場景下,它的作用會更加明顯。
Stoyanchev說Spring 5.0引入的變化對希望升級的已有應用不會帶來影響,因為新功能是與Spring MVC并存的。

在大多數的應用中,要么導入spring-webmvc(Servlet技術棧),要么導入spring-webflux(Reactive技術棧),已有的應用可以很容易地升級到Spring 5版本的spring-webmvc。

按照Stoyanchev的說法,Spring 5.0努力在Spring MVC和Spring WebFlux之間提供一致的體驗,開發人員可以在兩者之間做出選擇。這兩個Web框架通過靈活的控制器方法簽名,支持相同的注解編程模型。除此之外,Spring WebFlux還提供了可選的、函數式的Web端點編程模型,將其與Java 8 lambdas和內置的Kotlin擴展協同使用是很有吸引力的。
在Spring框架5.0中,我們實際上對Spring MVC進行了擴展,使其支持反應式的返回值,這樣的話,就允許Spring MVC控制器使用反應式WebClient和其他的反應式庫,比如反應式數據repositories,在這個過程中,依然能夠在任意的Servlet 3.1+容器中基于Servlet的Web端點技術進行操作。
InfoQ還咨詢了Stoyanchev,如果希望采用Spring 5.0的反應式編程模型的話,開發人員有什么需要預先注意的地方。

開發人員應該了解從編寫命令式風格的邏輯轉移到使用聲明式、異步的API時,有一個很大的學習曲線。另外,異步和非阻塞的代碼也更難調試,因為調用棧不再是唯一的。如果你剛剛開始接觸的話,建議從小范圍開始,留出足夠的時間去學習和適應。要慎重選擇最適合,并且能夠從非阻塞并發中獲益最多的應用。在決定開始之前,要衡量和證明性能方面所能帶來的收益。另外需要記住的是,有些地方是很容易上手的,比如在已有的Spring MVC應用中使用反應式WebClient。
InfoQ還與Spring框架項目的領導者Juergen Hoeller進行了交流,了解了他對Spring 5.0的想法。

Hoeller:我們以Java 8+作為基線,這樣能夠為整個框架帶來重要的API改善和眾多的內部優化。同時,Spring框架5.0能夠完全支持JDK 9,它能夠同時支持classpath以及模塊路徑。
核心容器為Java 8和Kotlin提供了函數式bean注冊的機制。

Hoeller補充說,Spring 5.0還為常見的Spring API提供了Kotlin擴展,比如JdbcTemplate和RestTemplate,并且還支持對Kotlin數據類(data class)進行數據綁定。

Hoeller總結了Spring 5.0其他重要的特性:
Spring框架5.0在運行時支持Java EE 8 API級別,比如支持將Servlet 4.0的PushBuilder注入到Spring MVC處理器方法中、用于JSON轉換的標準JSON Binding API(作為Jackson和Gson的替代方案)、JPA 2.2持久化技術以及注解驅動校驗的Bean Validation 2.0。綜上所述,我們的基線依然是Java EE 7+級別,依然支持所有的Servlet 3.1、JPA 2.1提供商等等。

意甲积分榜射手榜