做者|翟永超 git
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 九、HTTP/二、基於 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 的「輕量級」在其餘動態語言面前就顯得不那麼輕了。 github
輪子大師,前途未卜
在以後的 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 爲何忽然如此備受關注與推崇呢?主要有如下幾點: web
Spring Boot 雖然是基於 Spring 構建的,可是經過上面這些特性的支持,改變了咱們使用 Spring 的姿式,極大得簡化了構建企業級應用的各類配置工做,尤爲對於不少初學者來講,變得更加容易入門使用。
如約而至,升級與否?
萬衆期待的 Spring Boot 2.0 終於發佈了第一個正式版本,爲何 Spring Boot 2.0 如此受期待呢?我認爲主要有如下幾個緣由: spring
上述列舉的內容是筆者主要關心的重要內容,並不是 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 中整合了很多優秀的第三方組件,這些組件的升級也須要咱們作好必定的考量,在這些組件的版本升級過程當中,使用上是否有變化等問題。其中,最爲關鍵的幾個組件須要咱們注意: 編程
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 開發咱們的項目也是徹底沒有影響的。只是,就如上面所述的,咱們可能須要作一些依賴和配置上的調整才能繼續將應用正常的運行起來。 性能優化
總結與展望
感謝你們可以讀完上面我對 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 微服務實戰》做者框架