Spring Boot 2.0 的推出又激起了一陣學習 Spring Boot 熱,就單從我個人的博客的訪問量大幅增加就可以感受到大家對學習 Spring Boot 的熱情,那麼在這麼多人熱衷於學習 Spring Boot 之時,我們自己也在思考: Spring Boot 為什麼帶來了這麼大的變革。 ...
Spring Boot 2.0 的推出又激起了一陣學習 Spring Boot 熱,就單從我個人的博客的訪問量大幅增加就可以感受到大家對學習 Spring Boot 的熱情,那麼在這麼多人熱衷於學習 Spring Boot 之時,我們自己也在思考: Spring Boot 為什麼帶來了這麼大的變革。它誕生的背景是什麼?Spring 企業又是基於什麼樣的考慮創建的 Spring Boot? 傳統企業使用 Spring Boot 會給我們帶來什麼樣變化。
Spring 框架可以說是 Java 開發人員使用的最流行的應用程式開發框架之一。它目前由大量提供一系列服務的模塊組成。包括模塊容器,為構建橫切關註點提供支持的面向切麵編程(AOP),安全框架,數據存取框架,Web 應用框架和用於模塊測試提供支持的類。Spring 框架的所有組件都通過依賴註入粘在一起。依賴註入(也稱為控制反轉)使設計和測試鬆散耦合的軟體模塊變得更容易。
多年來 Spring 框架已變得足夠成熟。幾乎所有 Java 企業應用需要用到的基礎組件都可以在 Spring 框架中找到。但在一個新應用中將所有需要的 Spring 組件整合併配置好並不容易。這包括在 gradle/maven 中設置依賴庫,使用 xml、註解或 java 代碼配置需要的 Spring Bean。Spring 開發者意識到這裡的絕大多數工作是可以可以自動化的,Spring Boot 出現了!
Spring 框架的歷史
起點
2002 年 10 月,Rod Johnson 撰寫了一本名為 Expert One-on-One J2EE 設計和開發的書。本書由 Wrox出版,介紹了當時 Java 企業應用程式開發的情況,並指出了 Java EE 和 EJB 組件框架中的存在的一些主要缺陷。在這本書中,他提出了一個基於普通 Java 類和依賴註入的更簡單的解決方案。
在書中,他展示瞭如何在不使用 EJB 的情況下構建高質量,可擴展的線上座位預留系統。為了構建應用程式,他編寫了超過 30,000 行的基礎結構代碼。包含許多可重用的 Java 介面和類,如 ApplicationContext和BeanFactory。由於java介面是依賴註入的基本構建塊,因此他將這些類的根包命名為com.interface21。
一對一的 J2EE 設計和開發一炮而紅。本書免費提供的大部分基礎架構代碼都是高度可重用的。即使在 15 年後,本書及其原則仍然與構建高質量的 Java Web 應用程式相關。
Spring 誕生
在本書發佈後不久,開發者 Juergen Hoeller 和 Yann Caroff 說服 Rod Johnson 創建一個基於基礎結構代碼的開源項目。Rod,Juergen 和 Yann 於 2003 年 2 月左右開始合作開發該項目 。Yann 為新框架創造了“Spring”的名字。據 Rod 介紹,Spring 是傳統 J2EE 的新開始。
200 年 6 月,Spring 2.0 在 Apache 2.0 許可下發佈。2004 年 3 月,1.0 版發佈。有趣的是,在1.0發佈之前,spring 就被開發人員廣泛採用。2004 年 8 月,Rod Johnson,Juergen Hoeller,Keith Donald 和Colin Sampaleanu 共同創立了一家專註於 Spring 咨詢,培訓和支持的公司 interface21。
Yann Caroff 在早期離開了團隊,Rod Johnson 在 2012 年離開,Juergen Hoeller 仍然是 Spring 開發團隊的積極成員。
Spring 框架的快速增長
自 2004 年 1.0 版本發佈以來,Spring 框架迅速發展。Spring 2.0 於 2006 年 10 月發佈,到那時,Spring的下載量超過了 100 萬。Spring 2.0 具有可擴展的 XML 配置功能,用於簡化 XML 配置,支持 Java 5,額外的 IoC 容器擴展點,支持動態語言。
在 Rod 領導下管理 Interface21 項目於 2007 年 11 月更名為 SpringSource。同時發佈了 Spring 2.5。Spring 2.5 中的主要新功能包括支持 Java 6 / Java EE 5,支持註釋配置,classpath 中的組件自動檢測和相容 OSGi 的 bundle。
2007 年,SpringSource 從基準資本獲得了 A 輪融資(1000萬美元)。SpringSource 在此期間收購了多家公司,如Hyperic,G2One 等。2009年8月,SpringSource 以 4.2 億美元被 VMWare 收購。SpringSource 在幾周內收購了雲代工廠,這是一家雲 PaaS 提供商。2015 年,雲代工廠轉型成了非營利雲代工廠。
2009 年 12 月,Spring 3.0 發佈。Spring 3.0 具有許多重要特性,如重組模塊系統,支持 Spring 表達式語言,基於 Java 的 bean 配置(JavaConfig),支持嵌入式資料庫(如 HSQL,H2 和 Derby),模型驗證/ REST 支持和對 Java EE 的支持。
2011 年和 2012 年發佈了許多 3.x 系列的小版本。2012 年 7 月,Rod Johnson 離開了團隊。2013 年 4月,VMware 和 EMC 通過 GE 投資創建了一家名為 Pivotal 的合資企業。所有的 Spring 應用項目都轉移到了 Pivotal。
2013 年 12 月,Pivotal 宣佈發佈 Spring 框架 4.0。Spring 4.0 是 Spring 框架的一大進步,它包含了對Java 8 的全面支持,更高的第三方庫依賴性(groovy 1.8+,ehcache 2.1+,hibernate 3.6+等),Java EE 7 支持,groovy DSL for bean 定義,對 websockets 的支持以及對泛型類型的支持作為註入 bean 的限定符。
2014 年至 2017 年期間發佈了許多 Spring 框架 4.xx 系列版本。Spring 4.3.7 於 2017 年 3 月發佈。Spring 4.3.8 於 2017 年 4 月發佈,併成為 4.x 系列中的最後一個。Spring 框架的下一個延續的主要版本是在 5.0 版本展開。
Spring Boot 的歷史
2012 年 10 月,Mike Youngstrom 在 Spring jira 中創建了一個功能請求 , 要求在 Spring 框架中支持無容器 Web 應用程式體繫結構。他談到了在主容器引導 spring 容器內配置 Web 容器服務。這是 jira 請求的摘錄:
我認為 Spring 的 Web 應用體繫結構可以大大簡化,如果它提供了從上到下利用 Spring 組件和配置模型的工具和參考體繫結構。在簡單的 main()方法引導的 Spring 容器內嵌入和統一這些常用Web 容器服務的配置。
這一要求促使了 2013 年初開始的 Spring Boot 項目的研發。2014 年 4 月,Spring Boot 1.0.0 發佈。從那以後,一些 Spring Boot 版本出來了:
-
Spring boot 1.1(2014 年 6 月) - 改進的模板支持,gemfire 支持,elasticsearch 和 apache solr 的自動配置。
-
Spring Boot 1.2(2015 年 3 月) - 升級到 servlet 3.1 / tomcat 8 / jetty 9,spring 4.1 升級,支持 banner / jms / SpringBootApplication 註解。
-
Spring Boot 1.3(2016 年 12 月) - Spring 4.2 升級,新的 spring-boot-devtools,用於緩存技術(ehcache,hazelcast,redis 和 infinispan)的自動配置以及完全可執行的 jar 支持。
-
Spring boot 1.4(2017年1月) - spring 4.3 升級,支持 couchbase / neo4j,分析啟動失敗和RestTemplateBuilder。
-
Spring boot 1.5(2017年2月) - 支持 kafka / ldap,第三方庫升級,棄用 CRaSH 支持和執行器記錄器端點以動態修改應用程式日誌級別。
-
Spring boot 2.0(2018 年 03 月)-基於 Java 8,支持 Java 9,支持 Quartz ,調度程式大大簡化了安全自動配置,支持嵌入式 Netty
Spring Boot 簡單性使 java 開發人員能夠快速大規模地採用該項目。Spring Boot 可以說是在 Java 中開發基於 REST 的微服務 Web 應用程式的最快方法之一。。
Spring IO 和 Spring Boot
2014 年 6 月,Spring io 1.0.0 發佈。Spring io 代表應用程式庫之間的一組預定義的依賴關係。這意味著如果使用特定的 Spring IO 版本創建項目,則不再需要定義庫的版本。即使是 Spring Boot 啟動項目也是這個 Spring IO 的一部分。例如,如果你使用的是 spring io 1.0.0,則在添加啟動器項目的依賴關係時,不需要指定 spring 啟動版本。它會自動假定它是spring boot 1.1.1.RELEASE。
概念上,spring io 由模塊的基礎層和執行層域特定的運行時(DSR)組成。基礎層代表核心彈簧模塊和第三方依賴關係的策劃清單。Spring Boot 是 Spring IO 提供的執行層 DSR 之一。因此,現在有兩種主要的方法來構建應用程式,
-
使用或不使用 spring io 直接使用 Spring Boot。
-
使用所需 Spring 模塊的 Spring IO。
請註意,通常每當發佈新的 Spring 框架版本時,都會觸發新的 Spring 啟動版本。這將反過來引發新的Spring Boot 版本。
2015 年 11 月,Spring io 2.0.0 發佈。這提供了一套更新的依賴項,包括 Spring Boot 1.3。2016 年 7月,Spring io 團隊決定使用按字母順序排版的方案。Spring IO 為此使用城市名稱。在字母版本方案中,新名稱表示依賴庫的次要和主要升級。
2016 年 9 月,雅典發佈了首個按字母順序排列的城市命名的 Spring io 平臺版本。它包含 Spring Boot 1.4 和其他第三方庫升級。此後,雅典發佈了多個服務版本(SR1,SR2,SR3和SR4)。
2017 年 3 月,最新的 Spring io平臺(Brussels-SR1)發佈。它使用最新的 Spring Boot 版本 1.5.2。下一個 Spring io 平臺是開羅計劃推出的 spring boot 2.0 和 spring framework 5.0。
Spring 時間線圖表
微服務技術是程式員繞不開的話題,在這裡也順便給大家推薦一個架構交流學習群:650385180,裡面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分散式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,以下的課程體系圖也是在群里獲取。相信對於已經工作和遇到技術瓶頸的碼友,在這個群里一定有你需要的內容。
有人說,Spring Boot的出現,讓Java迎來了又一春,它是Java應用開發的顛覆者,徹底改變了Java應用開發的模式。
以往我們做Spring應用開發,要知道配置哪些類來讓Hibernate和Spring一起工作,要知道如何配置view resolver來控制哪個模版進行視圖層的展示。經常寫了一大堆代碼之後發現只是在處理Spring框架本身的配置,根本一行業務邏輯都沒有寫。
開發完成之後,我們還要考慮部署的問題,且不說部署到非常笨重的應用伺服器,比如WebSphere, Weblogic或者JBoss,即使部署到Tomcat或者Jetty這種輕量級容器上面,我們要知道如何配置容器,如何修改配置文件等等。而且在多應用部署到同一個Tomcat的時候,經常會出現衝突。就算我們花了很大力氣解決了這些問題,程式部署成功之後,我們很難去瞭解這個程式的運行狀態。有可能我們要配置很多第三方工具來去知道這個應用程式運行狀態如何,有哪些參數,環境變數是什麼。儘管Spring幫我們解決了依賴註入的問題,簡化了一些MVC的流程,但是Spring框架本身集成了越來越多東西,導致其越來越難配置,維護成本成直線上升。
很多時候,Python, Ruby或者JavaScript程式員敲幾個命令安裝一些庫,然後簡單的敲幾行代碼,引入一些框架比如flask,然後直接一個簡單的API就可以跑起來了。Java程式員可能還在研究該使用Maven裡面的哪個庫,如何在代碼裡面進行配置。
但是現在 Spring Boot的出現讓這一情況有了很大的改觀。
它使用“習慣優於配置”(項目中存在大量的配置,此外還內置一個習慣性的配置,讓你無須手動進行配置)的理念讓你的項目快速運行起來。使用Spring Boot 很容易創建一個獨立運行(運行jar,內嵌Servlet 容器)、準生產級別的基於Spring框架的項目,使用Spring Boot 你可以不用或者只需要很少的Spring 配置。
【Spring Boot 核心功能】
- 獨立運行的Spring 項目
Spring Boot 可以以jar 包的形式獨立運行,運行一個Spring Boot 項目只需通過java –jarxx.jar 來運行。
- 內嵌Servlet 容器
Spring Boot 可選擇內嵌Tomcat、Jetty 或者Undertow ,這樣我們無須以war 包形式部署項目。
- 提供starter 簡化Maven 配置
Spring 提供了一系列的starter pom 來簡化Maven 的依賴載入,例如,當你使用了spring-boot-starter-web 時,會自動加入如下圖所示的依賴包。
- 自動配置Spring
Spring Boot 會根據在類路徑中的jar 包、類,為jar 包里的類自動配置Bean,這樣會極大地減少我們要使用的配置。當然,Spring Boot 只是考慮了大多數的開發場景,並不是所有的場景,若在實際開發中我們需要自動配置Bean,而Spring Boot 沒有提供支持,則可以自定義自動配置。
- 準生產的應用監控
Spring Boot 提供基於http、ssh、telnet 對運行時的項目進行監控。
- 無代碼生成和xml 配置
Spring Boot 的神奇的不是藉助於代碼生成來實現的,而是通過條件註解來實現的,這是Spring 4.x 提供的新特性。
Spring 4.x 提倡使用Java 配置和註解配置組合,而Spring Boot 不需要任何xml 配置即可實現Spring 的所有配置。
SpringBoot 不僅讓我們做Java開發變的簡單有效,更重要的是SpringBoot徹底顛覆了我們對Java開發的認識,讓我們第一次有了”原來Java開發可以這麼做” 的感覺。