阿里P9告訴你 Spring Boot 2.0正式發佈,升仍是不升呢?

Spring帝國

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

挑戰權威,一戰成名

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的理由並非這些與業務直接相關的功能,而是上面所說起的與業務實現絕不相關的兩大核心。github

因爲在初期版本中Spring對不少功能性封裝並無今天的Spring那麼強大,因此很長一段時間,咱們都採用了Spring作工程管理來整合其餘更優秀的功能型框架來完成系統開發的架構模式,好比曾經風靡一時的Spring + Struts + Hibernate架構,相信能夠勾起一代人的回憶。web

優雅靈活,吸粉無數

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

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

輪子大師,前途未卜

在以後的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終於發佈了第一個正式版本,爲何Spring Boot 2.0如此受期待呢?我認爲主要有如下幾個緣由:

  1. 支持最新的Java 9
  2. 基於Spring 5構建,Spring的新特性都可以在Spring Boot 2.0中使用
  3. 爲各類組件的響應式編程提供了自動化配置,如:Reactive Spring Data、Reactive Spring Security等
  4. 支持Spring MVC的非阻塞式替代方案WebFlux以及嵌入式Netty Server
  5. 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

更多的依賴變化、配置重定位以及默認配置的變化,讀者可自行查閱官方升級手冊:Spring Boot 2.0 Migration Guide

沒必要要的顧慮

以前有朋友在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的忠實擁護者,在時間容許的狀況下,這是一件必然會去嘗試的事情,在將來的時間裏,我也儘量的但願抽出時間繼續分享一些其中的問題與收穫,與你們共勉!

須要瞭解獲取更多學習資料或者視頻請關注微信公衆號:

相關文章
相關標籤/搜索