Spring Boot 2.0正式發佈,新特性解讀

来源:https://www.cnblogs.com/xueSpring/archive/2018/03/01/8489414.html
-Advertisement-
Play Games

作者|翟永超 Spring Boot 2.0 來啦,有哪些新特性?升級嗎? 寫在前面 北京時間 3 月 1 日,經過漫長的等待之後,Spring Boot 2.0 正式發佈。作為 Spring 生態中的重要開源項目,Spring Boot 旨在簡化創建產品級的 Spring 應用和服務。用戶只需要" ...


作者|翟永超 

Spring Boot 2.0 來啦,有哪些新特性?升級嗎? 

寫在前面 

北京時間 3 月 1 日,經過漫長的等待之後,Spring Boot 2.0 正式發佈。作為 Spring 生態中的重要開源項目,Spring Boot 旨在簡化創建產品級的 Spring 應用和服務。用戶只需要"run"就能創建一個獨立的,產品級別的 Spring 應用。 

一經發佈,Spring Boot 就迅速受到了開發者的親睞,到目前為止,它已經有超過 2 萬個 Star,1.6 萬個 fork(2017 年 GitHub 排名前十)。而 Spring Boot 2.0 的醞釀已有一段時間,從去年 5 月 16 日發佈 M1 版本,再到後來的 RC 版本,也已有近 1 年時間。 

Spring 2.0 中引入了眾多令人激動的新特性,包括支持 Java 9、HTTP/2、基於 Spring 5 構建、強力集成 GSON 等等。為了瞭解 Spring Boot 的整體發展歷史,以及 2.0 中的重要更新,InfoQ 特邀請到 Spring Boot 專家、永輝雲創架構師翟永超撰文解讀。 


Spring 帝國 

Spring 幾乎是每一位 Java 開發人員都耳熟能詳的開發框架,不論你是一名初出茅廬的程式員還是經驗豐富的老司機,都會對其有一定的瞭解或使用經驗。在現代企業級應用架構中,Spring 技術棧幾乎成為了 Java 語言的代名詞,那麼 Spring 為什麼能夠在眾多開源框架中脫穎而出,成為業內一致認可的技術解決方案呢?我們不妨從最初的 Spring Framework 開始,看看它為什麼能夠橫掃千軍,一統江湖! 

挑戰權威,一戰成名 

2004 年 3 月,Spring 的第一個版本以及其創始人 Rod Johnson 的經典力作《Expert one-on-one J2EE Development without EJB》發佈,打破了當時 Java 開發領域的傳統思考模式,企業級應用開始走向“輕量化”發展的步伐。 

最初的 Spring Framework 1.0 並不像如今的 Spring 那麼複雜,但是在該版本中已經包含了 Spring 中最為核心的兩大要素:依賴註入(IOC)和麵向切麵編程(AOP),這兩個功能是 Spring 區別於其他優秀框架,併在企業級應用中建立核心地位的關鍵所在。 

很多開發者在初涉 Java 應用的時候很可能會覺得這兩個功能的意義並不大,因為不用它們我們依然可以很好的實現業務功能,事實也確實如此,但是隨著業務的迭代和開發的深入,複雜多變的需求開始慢慢侵蝕原本“完美”的架構,開發與測試的難度逐步增大,往往在這個時候,我們才體會到了 Spring 的價值。 

所以,即便在 Spring 的最初版本中也封裝了諸多偏業務型的功能封裝,如:郵件發送、事務管理等,但我們要知道真正讓企業級應用離不開 Spring 的理由並不是這些與業務直接相關的功能,而是上面所提及的與業務實現毫不相關的兩大核心。 

由於在初期版本中 Spring 對很多功能性封裝並沒有今天的 Spring 那麼強大,所以很長一段時間,我們都採用了 Spring 做工程管理來整合其他更優秀的功能型框架來完成系統開發的架構模式,比如曾經風靡一時的 Spring + Struts + Hibernate 架構,相信可以勾起一代人的回憶。 

優雅靈活,吸粉無數 

Spring 在發佈並獲得業界的普遍認可之後,Spring 開源社區變得異常活躍,除了社區自身不斷對 Spring 進行增強之外,其他功能性框架也紛紛對 Spring 進行適配與支持。在隨後發佈的 Spring 2.x 和 3.x 中,先後支持了 Annotation 的優雅配置方式以及更為靈活的 Java 類的配置,這使得 Spring 在管理 Bean 的配置方式上變得更為多樣化。 

但是隨著 Spring 的深入應用,繁瑣的配置問題也開始顯現,我們會發現每次在構建項目的時候總是在不斷的複製黏貼著一些模版化的配置與代碼,有時候我們只是想實現幾個很簡單的功能,結果配置內容遠大於業務邏輯代碼的編寫;同時,在框架整合過程中,對於一些共同依賴的 Jar 包存在著潛在的衝突風險,使得一些複雜的整合任務變得困難起來。所以,Spring 的“輕量級”在其他動態語言面前就顯得不那麼輕了。 

推薦一個Java高級技術進階群,助你成為一名優秀的架構師: 群號:688583154,可獲取免費的Java架構師學習資料,都是目前最主流的技術,講解框架的結構構造,底層原理,還有源碼分析,性能優化這些知識點。



輪子大師,前途未卜 

在之後的 Spring 4.x 中除了提供對 Java 8 的支持以及對依賴註入的增強之外,有很長一段時間,Spring 社區對其核心框架的創新就沒有那麼出彩了,社區更多的精力開始將矛頭轉向了曾經那些親密無間的小伙伴們。於是,我們在 Spring 社區發現多出了各種功能性的兄弟項目,比如:簡化數據訪問的 Spring Data、提供批處理能力的 Spring Batch、用於保護應用安全的 Spring Security 等。 

雖然這些框架從個體來說都有一定的優勢和先進的理念,但是對於很多既有系統來說,在功能性框架上很難做出改變,對於這些新生的輪子項目就很難得到應用,除了一些從零開始的系統會做一些嘗試之外,鑒於學習成本和踩坑風險的考慮,中小團隊對這些新項目很少有願意去嘗試的。所以,一些老牌的功能性框架除非有嚴重的性能或安全問題出現,不然很難被這些輪子所替代。 

在這段時間里,雖然 Spring 社區推出了那麼多的輪子項目,但是真正在國內得到廣泛應用的並不多,很多開發團隊依然只是使用最核心的 IOC 和 AOP,並根據自己團隊的技術棧情況整合出更適合自身的腳手架來進行系統開發。 

神兵出世,再創輝煌 

2014 年 4 月 1 日,Spring Boot 發佈了第一個正式版本。該項目旨在幫助開發者更容易地創建基於 Spring 的應用程式和服務,使得現有的和新的 Spring 開發者能夠最快速地獲得所需要的 Spring 功能。一直到今天發佈 2.x 版本,共經歷了近 4 年的發展,Spring Boot 已經是一個擁有了 21000 多 Star,15000 多次 Commits,貢獻者超過 400 多名的超熱門開源項目。 

Spring Boot 為什麼突然如此備受關註與推崇呢?主要有以下幾點: 

  • 簡化依賴管理:在 Spring Boot 中提供了一系列的 Starter POMs,將各種功能性模塊進行了劃分與封裝,讓我們可以更容易的引入和使用,有效的避免了用戶在構建傳統 Spring 應用時維護大量依賴關係而引發的 JAR 衝突等問題。
  • 自動化配置:Spring Boot 為每一個 Starter 都提供了自動化的 Java 配置類,用來替代我們傳統 Spring 應用在 XML 中繁瑣且並不太變化的 Bean 配置;同時藉助一系列的條件註解修飾,使得我們也能輕鬆的替換這些自動化配置的 Bean 來進行擴展。
  • 嵌入式容器:除了代碼組織上的優化之外,Spring Boot 中支持的嵌入式容器也是一個極大的亮點(此處仿佛又聽到了 Josh Long 的那句:“Deploy as a Jar, not a War”),藉助這個特性使得 Spring Boot 應用的打包運行變得非常的輕量級。
  • 生產級的監控端點:spring-boot-starter-actuator的推出可以說是 Spring Boot 在 Spring 基礎上的另一個重要創新,為 Spring 應用的工程化變得更加完美。該模塊並不能幫助我們實現任何業務功能,但是卻在架構運維層面給予我們更多的支持,通過該模塊暴露的 HTTP 介面,我們可以輕鬆的瞭解和控制 Spring Boot 應用的運行情況。

Spring Boot 雖然是基於 Spring 構建的,但是通過上面這些特性的支持,改變了我們使用 Spring 的姿勢,極大得簡化了構建企業級應用的各種配置工作,尤其對於很多初學者來說,變得更加容易入門使用。 

如約而至,升級與否? 

萬眾期待的 Spring Boot 2.0 終於發佈了第一個正式版本,為什麼 Spring Boot 2.0 如此受期待呢?我認為主要有以下幾個原因: 

  • 支持最新的 Java 9
  • 基於 Spring 5 構建,Spring 的新特性均可以在 Spring Boot 2.0 中使用
  • 為各種組件的響應式編程提供了自動化配置,如:Reactive Spring Data、Reactive Spring Security 等
  • 支持 Spring MVC 的非阻塞式替代方案 WebFlux 以及嵌入式 Netty Server
  • Spring Boot 2.0 的發佈,Spring Cloud Finchley 還會遠嗎?

上述列舉的內容是筆者主要關心的重要內容,並非 Spring Boot 2.0 所有的新特性,對於不同的使用者來說相信會有不同的關註點。 

除此之外,在 Spring Boot 2.0 中還有非常多其他令人振奮的新特性,比如:對 HTTP/2 的支持、新增了更靈活的屬性綁定 API(可以不通過@ConfigurationProperties註解就能實現配置內容讀取和使用)、對 Spring Security 整合的簡化配置、Gradle 插件的增強、Actuator 模塊的優化等等。 

本文不對這些新特性做詳細的介紹,下麵主要說說,我們是否有必要將我們的 Spring Boot 1.x 升級到 Spring Boot 2.x,在這過程中,我們需要考慮和註意哪些問題。 

Java 版本要求的變化 

我們在選擇是否要升級 Spring Boot 的時候,最先需要考慮的是 Java 版本的選擇。在 Spring Boot 2.0 中提高了對 Java 版本的要求,我們需要至少使用 Java 8 才能使用它,如果你的 Spring Boot 應用還運行在 Java 7 上,那就還得考慮 Java 的升級成本。 

另外,在未來的一段時間內,你是否想要使用 Java 9 將是一個影響升級與否的重要決策依據,因為 Spring Boot 1.x 版本明確說明瞭沒有對 Java 9 的支持計劃;換言之,如果你想將 Spring Boot 運行在 Java 9 上,那麼你必須升級到 Spring Boot 2.0。 

Tips:當前版本的 Spring Boot 2.0 雖然支持 Java 9,但是依然還有一些問題。比如:JDK 的代理支持需要使用 AspectJ 1.9,但是該版本還處於 RC 版;還不支持 Apache Cassandra;對於 JSP TLDs 在嵌入式 Tomcat 中也無法支持等情況。對於這些問題的具體處理方法可見:Running Spring Boot on Java 9 

依賴組件的升級 

Spring Boot 的 Starter 中整合了不少優秀的第三方組件,這些組件的升級也需要我們做好一定的考量,在這些組件的版本升級過程中,使用上是否有變化等問題。其中,最為關鍵的幾個組件需要我們註意: 

  • Tomcat 升級至 8.5
  • Flyway 升級至 5
  • Hibernate 升級至 5.2
  • Thymeleaf 升級至 3

Tips:前幾日曝出的 Tomcat 漏洞問題。經查 Spring Boot 2.0 選用的版本為 8.5.28,屬於安全版本,所以大家可以放心使用。 

依賴重組和配置重定位 

在 Spring Boot 2.0 的升級過程中,可能這部分內容將是大家要做出較多修改的地方,所以建議大家在這裡留個心眼。由於 Spring Boot 在構建 Starter POMs 的時候並非是扁平的一層結構,一些功能模塊 Starter 之間是存在包含引用關係的,比如:spring-boot-starter-thymeleaf 中包含了 spring-boot-starter-web,因為 thymeleaf 模版引擎之前肯定是在 Spring MVC 下使用的。 

但是,在 Spring Boot 2.0 中,WebFlux 的出現對於 Web 應用的解決方案將不再唯一,因此 spring-boot-starter-thymeleaf 中的依賴就不在包含 spring-boot-starter-web,開發人員需要自己添加 spring-boot-starter-web 或 spring-boot-starter-webflux 來決定是使用哪個模塊實現 Web 應用。 

除了類似上面的依賴重組之後,在 Spring Boot 2.0 中對於配置屬性的重定位也是比較多的,這將導致一些原有的配置將不再生效,需要我們手工的去修改這些配置的 Key 來完成升級適配。比如,一些與 servlet 相關的server.*屬性重定位到server.servlet首碼下: 

Old property New property
server.context-parameters.* server.servlet.context-parameters.*
server.context-path server.servlet.context-path
server.jsp.class-name server.servlet.jsp.class-name
server.jsp.init-parameters.* server.servlet.jsp.init-parameters.*
server.jsp.registered server.servlet.jsp.registered
server.servlet-path server.servlet.path


更多的依賴變化、配置重定位以及預設配置的變化,讀者可自行查閱官方升級手冊 

不必要的顧慮 

之前有朋友在 spring4all 社區上問:如果 Spring Boot 升級 2.0,2.0 出了那麼多新功能,我們的業務代碼是否也需要隨之修改,風險會不會很大?其實,這個問題大家完全不用太多的顧慮,Spring Boot 2.0 雖然新增了很多強大的新特性,但是對於原有功能的支持並沒有拋棄。所以,就算我們不用任何類似 WebFlux 這樣的新功能,將工程升級到了 Spring Boot 2.0 之後,繼續使用 Spring MVC 開發我們的項目也是完全沒有影響的。只是,就如上面所述的,我們可能需要做一些依賴和配置上的調整才能繼續將應用正常的運行起來。 

推薦一個Java高級技術進階群,助你成為一名優秀的架構師: 群號:688583154,可獲取免費的Java架構師學習資料,都是目前最主流的技術,講解框架的結構構造,底層原理,還有源碼分析,性能優化這些知識點。

總結與展望 

感謝大家能夠讀完上面我對 Spring Boot 2.0 的薄見,希望這些內容能夠對你在 Spring Boot 2.0 的選擇上有一定的參考價值。這個版本雖然不像 Spring Boot 1.0 那樣顛覆我們對繁瑣的 Spring 應用的認識,但是依然透露著很多時代前沿的氣息。同時,Spring Boot 2.0 的發佈,也意味著 Spring Cloud Finchley 里正式發佈又近了一步,因為這個版本中同樣的將會帶來很多令人興奮的內容,相信這一天的到來也不遠了! 

對於當前 Spring Boot 2.0 的遷移升級,作為一名 Spring Boot 與 Spring Cloud 的忠實擁護者,在時間允許的情況下,這是一件必然會去嘗試的事情,在未來的時間里,我也儘可能的希望抽出時間繼續分享一些其中的問題與收穫,與大家共勉! 

作者介紹 翟永超,供職於永輝雲創,任架構師,負責 Spring Cloud 微服務架構的落地。《Spring Cloud 微服務實戰》作者


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近期項目中,用 jenkins 熱部署 web工程時,發現工程中靜態持有的線程(將ScheduledExecutorService定時任務存儲在靜態Map中),導致不定時出現資料庫訪問事務關閉異常,如下:org.springframework.transaction.CannotCreateTran ...
  • word裡面有2張表,需要找到第二張表,並寫入execl中: 代碼如下: 運行後生成文件 roro.xlsx,內容如下: ...
  • Java內部類 一、 含義 在Java編程語言里,程式是由類(class)構建而成的。在一個類的內部也可以聲明類,我們把這 樣的類叫做內部類。 二、 作用 實現了更好的封裝,我們知道,普通類(非內部類)的訪問修飾符不能為private或protected,而內部類可以。當我們將內部類聲明為priva ...
  • 之前寫了一篇ArrayList,那麼今天就寫一篇他的姊妹篇,LinkedList。 眾所周知,ArrayList底層數據是數組,可以在O(1)的時間內get到數據,但刪除和插入就要O(n)時間複雜度。 所以出現了鏈表,鏈表可以在O(1)的時間內插入,並且不會浪費記憶體,用多少就鏈接多少即可。 我們從以 ...
  • AJAX跨域完全講解 今天在慕課網上學習了AJAX跨域完全講解: "https://www.imooc.com/learn/947" 我在收集AJAX面試題的時候其實就已經有過AJAX跨域的問題的了,當時候知道了為什麼會存在跨域,以及跨域解決的方案有哪些,今天隨著課程的學習,又加深了AJAX跨域的理 ...
  • 1、前言 理解JVM的垃圾回收機制(簡稱GC)有什麼好處呢?作為一名軟體開發者,滿足自己的好奇心將是一個很好的理由,不過更重要的是,理解GC工作機制可以幫助你寫出更好的Java程式。 在學習GC前,你應該知道一個技術名詞:“stop the world” ,無論你選擇哪種GC演算法,“stop the ...
  • (1) 將Date格式化為String (2) 將String解析為Date ...
  • 對於前幾天數據類型的補充1、整形inta.幾種輸入的方法 a = 123 a = int(123) 對於當我們在設備上輸入a = 123時其實Python內部他們會把他轉換為int(123),對於後面的括弧在Python的內部其實是調用了__init__ b.int的內部優化 像下麵這種情況他們在內 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...