概述
Spring框架是在Java開發(fā)中廣泛使用的框架之一,是SSH中還能持久熱門的長(zhǎng)青樹。在Struts 2被安全漏洞打擊的一撅不正,在RESTful、微服務(wù)流行的今天,Spring仍然在扛著Java在這些web開發(fā)方面的大旗。
Spring框架由大量的模塊及其提供的一系列服務(wù)構(gòu)成。其中包括組件容器,用于構(gòu)建橫向關(guān)注面向業(yè)務(wù)的編程支持,安全框架,數(shù)據(jù)訪問(wèn)框架,Web應(yīng)用程序框架和測(cè)試組件的支持類等。所有這些組件都通過(guò)依賴注入架構(gòu)模式關(guān)聯(lián)在一塊。依賴注入(IOC,也稱為控制反轉(zhuǎn))使得設(shè)計(jì)和測(cè)試松散耦合軟件組件變得非常方便。目前Spring框架版本的是5.0.4,下一個(gè)版本5.05即將發(fā)布。
多年以來(lái),Spring框架一直保持持續(xù)快速的增長(zhǎng)?;旧纤鵍ava企業(yè)級(jí)應(yīng)用程序開發(fā)基礎(chǔ)架構(gòu)中都會(huì)包括Spring框架。然而,將所有需要的Spring組件集成和配置頗耗力氣。包括在gradle和maven中設(shè)置庫(kù)依賴項(xiàng),然后使用xml,annotations或java代碼配置所需的spring bean。
Spring開發(fā)人員也意識(shí)了到這是個(gè)頭疼的問(wèn)題,希望尋求自動(dòng)化工具來(lái)自動(dòng)完成這個(gè)工作。于是引入了Sprint Boot。
Spring boot采取定制地方法構(gòu)建Sprint應(yīng)用。這意味著對(duì)于Spring的每個(gè)主用例,Spring boot都定義一組默認(rèn)的組件依賴關(guān)系和組件的自動(dòng)配置。 Spring boot使用一系列的預(yù)制啟動(dòng)項(xiàng)來(lái)實(shí)現(xiàn)這個(gè)功能。比如,要構(gòu)建一個(gè)Sprint Web應(yīng)用程序,你只需添加?spring-boot-starter-web的依賴;要使用Sprint email庫(kù),只需添加對(duì)spring-boot-starter-mail的依賴。 Spring boot還有一些很酷的功能,例如在應(yīng)用中嵌入應(yīng)用服務(wù)器(jetty 或者tomcat),基于groovy和健康、度量監(jiān)控的命令行界面。
Spring boot使Java開發(fā)人員能夠快速發(fā)起一個(gè)包含所有必需的Spring組件的新項(xiàng)目。
在本文主要介紹Spring框架和Spring boot發(fā)展歷史。
Spring框架的歷史
起點(diǎn)
2002年10月,Rod Johnson撰寫了一本名為《Expert One-on-One J2EE設(shè)計(jì)和開發(fā)》的書。本書由Wrox出版,概括了當(dāng)時(shí)Java企業(yè)應(yīng)用程序開發(fā)的現(xiàn)狀,指出了Java EE和EJB組件框架中的一些主要缺陷。在這本書中,他提出了一個(gè)基于普通Java類和注入依賴的更簡(jiǎn)單的解決方案。以下是書中提出的一些問(wèn)題:
將工作流邏輯集中到抽象超類中是反轉(zhuǎn)控制的一個(gè)例子。與傳統(tǒng)的由類庫(kù)用戶代碼調(diào)用庫(kù)代碼的方法不同,在這種方法中,超類中的框架代碼調(diào)用用戶代碼。反轉(zhuǎn)控制是框架的基礎(chǔ),它傾向于大量使用模板方法模式。
在書中,他展示了如何在不使用EJB的情況下構(gòu)建高質(zhì)量,可擴(kuò)展的在線座位預(yù)定程序。為了構(gòu)建這個(gè)程序,他編寫了超過(guò)30000行的基礎(chǔ)結(jié)構(gòu)代碼(牛逼)!其中包含了大量可重用的Java的接口和類,例如ApplicationContext和BeanFactory等。由于Java的接口是依賴注入的基本構(gòu)建塊,他將這些類的根包命名為com.interface21。正如羅德后來(lái)解釋的那樣,21這個(gè)是指21世紀(jì),寓意對(duì)21世紀(jì)的展望。
《Expert One-on-One J2EE設(shè)計(jì)和開發(fā)》一炮走紅。書中附帶的免費(fèi)基礎(chǔ)架構(gòu)代碼都高度可重用,很快一些有眼力見的開發(fā)人員就在他們的項(xiàng)目中使用了。 Wrox也為該書提供了源代碼和勘誤表的網(wǎng)頁(yè),也有一個(gè)在線論壇做問(wèn)題討論。如今16年過(guò)去了,這本書和他提出的一些原則仍然還在指導(dǎo)著高質(zhì)量的Java Web應(yīng)用程序構(gòu)建。筆者強(qiáng)烈建議,所有有志于這方面的碼農(nóng)可以搞一份收藏,備用查看,如果有需要的話給蟲蟲留言。
Spring的誕生
在本書發(fā)布后不久,開發(fā)者Juergen Hoeller和Yann Caroff說(shuō)服Rod Johnson基于書上的代碼創(chuàng)建一個(gè)開源基礎(chǔ)框架的項(xiàng)目。 于是在2003年2月左右由Rod,Juergen和Yann一起創(chuàng)建了一個(gè)項(xiàng)目,并且Yann為新框架起了一個(gè)很詩(shī)意的名字"Spring"。寓意著要給處于"冬天"的傳統(tǒng)J2EE帶來(lái)新開始。
Rod Johnson的書以非常詳盡,翔實(shí)和實(shí)用的方式介紹了J2EE的最佳實(shí)踐。從編碼標(biāo)準(zhǔn),陳規(guī),bean實(shí)體,單元測(cè)試,設(shè)計(jì)決策,持久性,緩存,EJB,model-2表示層,視圖,驗(yàn)證技術(shù)還有性能等方面都有翔實(shí)的論述。書中案例是帶領(lǐng)大家做個(gè)java項(xiàng)目開發(fā)的絕佳之旅,從開發(fā)現(xiàn)狀、制約因子,風(fēng)險(xiǎn)及至最佳決策。它不光是一本教科書,還是一個(gè)Java開發(fā)的知識(shí)庫(kù)。
2003年6月,Spring 0.9以Apache 2.0許可協(xié)議發(fā)布。 2004年3月Spring 1.0版發(fā)布。實(shí)際上在1.0發(fā)布之前,Spring就已經(jīng)得到開發(fā)人員的廣泛使用。 2004年8月,Rod Johnson,Juergen Hoeller,Keith Donald和Colin Sampaleanu共同創(chuàng)立了interface21,,一家專注于Spring咨詢,培訓(xùn)和支持的公司。
Yann Caroff在不久就離開了團(tuán)隊(duì)。 Rod Johnson也在2012年離開了Spring團(tuán)隊(duì)。Juergen Hoeller則一直是Spring的活躍的開發(fā)者。
Spring快速發(fā)展
自2004年發(fā)布1.0版本以來(lái),Spring框架得到迅速發(fā)展。Spring 2.0于2006年10月發(fā)布,截止當(dāng)時(shí),Spring的下載量超過(guò)100萬(wàn)。 Spring 2.0具有可擴(kuò)展的XML配置功能,用于簡(jiǎn)化XML配置,還支持Java 5,額外的IoC容器擴(kuò)展點(diǎn),支持動(dòng)態(tài)語(yǔ)言(如groovy,aop增強(qiáng)功能和新的bean范圍)。
2007年11月Interface21公司更名為SpringSource。同時(shí)發(fā)布了Spring 2.5。 Spring 2.5中的主要新功能包括支持Java 6 和Java EE 5,支持配置注釋,支持自動(dòng)檢測(cè)和兼容組件的類路徑和OSGi兼容bundle。
2007年,SpringSource從benchmark capital獲得了1000萬(wàn)美元A輪投資。 SpringSource在2008年通過(guò)來(lái)accel partners 和 benchmark的B輪投資,籌集了更多的資金。此期間它還收購(gòu)了多家公司(Covalent, Hyperic, G2One等)。 2009年8月,SpringSource以4.2億美元被VMWare收購(gòu),SpringSource又在幾周內(nèi)收購(gòu)了cloud foundry,這是一家云PaaS供應(yīng)商。 2015年,cloud foundry轉(zhuǎn)移到了非營(yíng)利的cloud foundry基金會(huì)。
2009年12月,Spring 3.0發(fā)布。 Spring 3.0具有許多重要特性,如模塊重組系統(tǒng),支持Spring表達(dá)式語(yǔ)言,基于Java的bean配置(JavaConfig),嵌入式數(shù)據(jù)庫(kù)(如HSQL,H2和Derby)支持,模型驗(yàn)證和REST支持,以及對(duì)Java EE 6的支持。
2011年和2012年發(fā)布了許多3.x系列的小版本。2012年7月,Rod Johnson離開了Spring團(tuán)隊(duì)。2013年4月,VMware和EMC通過(guò)GE投資創(chuàng)建了一家名為Pivotal的合資企業(yè)。所有的Spring項(xiàng)目都轉(zhuǎn)移到了Pivotal。
2013年12月,Pivotal宣布發(fā)布Spring框架4.0。 Spring 4.0是Spring框架的一個(gè)重大版本升級(jí),包含了對(duì)Java 8的全面支持,更高版本的第三方庫(kù)依賴(groovy 1.8+,ehcache 2.1+,hibernate 3.6+等),Java EE 7的支持,bean定義的groovy DSL,websockets的支持,以及注入bean限定符泛型支持。
2014年至2017年期間發(fā)布了許多Spring框架4.x.x版本。
Spring 5.0 GA版本于2017年9月28日發(fā)布。Spring 5.0開始支持JDK 8和Java EE 7,同時(shí)兼容JDK9。全面支持Servlet 3.1,還引入了一個(gè)全新的模塊Spring WebFlux用于替代老話的 spring-webmvc;對(duì)Kotlin也有了更好的支持。
Spring Boot的歷史
2012年10月,Mike Youngstrom在Spring jira中創(chuàng)建了一個(gè)功能需求,要求在Spring框架中支持無(wú)容器Web應(yīng)用程序體系結(jié)構(gòu)。他建議通過(guò)main方法引導(dǎo)的Spring容器內(nèi)配置Web容器服務(wù)。
這一需求促成了2013年初開始的Spring Boot項(xiàng)目的開發(fā)。2014年4月,Spring Boot 1.0.0發(fā)布。從那以后,一些Spring Boot小版本開始出現(xiàn)。
Spring Boot 1.1(2014年6月):改進(jìn)的模板支持,gemfire支持,elasticsearch和apache solr的自動(dòng)配置。
Spring boot 1.2(2015年3月):升級(jí)到servlet 3.1/tomcat 8/jetty 9和spring 4.1,支持banner/jms /SpringBoot Application注釋。
Spring boot 1.3(2016年12月):升級(jí)到spring4.2,新的spring-boot-devtools,緩存技術(shù)的自動(dòng)配置(ehcache,hazelcast,redis,guava和infinispan)以及完全可執(zhí)行的jar支持。
Spring boot 1.4(2017年1月):升級(jí)到spring 4.3,couchbase/neo4j支持,啟動(dòng)失敗分析和RestTemplateBuilder。
Spring boot 1.5(2017年2月):支持kafka /ldap,第三方庫(kù)升級(jí),放棄對(duì)CRaSH支持和執(zhí)行器日志終端用以動(dòng)態(tài)修改應(yīng)用程序日志級(jí)別。
Spring boot的簡(jiǎn)便性使java開發(fā)人員能夠快速大規(guī)模地應(yīng)用于項(xiàng)目。 Spring boot可以說(shuō)是Java中開發(fā)基于RESTful微服務(wù)Web應(yīng)用的最快方法之一。它也非常適合docker容器部署和快速原型設(shè)計(jì)。
目前Spring boot 最新版本是2.0.0,于2018年3月1日發(fā)布,新版本特點(diǎn)有:
基于 Java 8,支持 Java 9;支持 Quartz 調(diào)度程序;支持嵌入式 Netty,Tomcat, Undertow 和 Jetty 均已支持 HTTP/2;執(zhí)行器架構(gòu)重構(gòu),支持 Spring MVC, WebFlux 和 Jersey;對(duì)響應(yīng)式編程提供最大支持;引入對(duì) Kotlin 1.2.x 的支持,并提供了一個(gè) runApplication 函數(shù),用Kotlin 通用的方式啟動(dòng) Spring Boot 應(yīng)用程序。
Spring IO和Spring Boot
2014年6月,Spring io 1.0.0發(fā)布。 Spring io代表預(yù)定義應(yīng)用類庫(kù)和依賴關(guān)系(包括Spring工程和第三方庫(kù))依賴維護(hù)平臺(tái),Sppring io可以完美的支持Maven和Gradle。這意味著如果你使用特定的Spring IO版本創(chuàng)建項(xiàng)目,則無(wú)需配置你所使用的庫(kù)的版本。請(qǐng)注意,這包括Spring庫(kù)和大多數(shù)流行的第三方庫(kù)。Spring boot啟動(dòng)器工程也是Spring io的一部分。例如,如果你使用的是spring io 1.0.0,則在添加啟動(dòng)器項(xiàng)目的依賴關(guān)系時(shí),不需要指定spring boot版本。它會(huì)自動(dòng)設(shè)定它為spring boot 1.1.1.RELEASE。
在概念上spring io由基礎(chǔ)層模塊和執(zhí)行層領(lǐng)域特定運(yùn)行時(shí)(DSRs)組成?;A(chǔ)層包括core Spring模塊和關(guān)聯(lián)的第三方依賴關(guān)系,可確定不會(huì)有沖突。執(zhí)行層提供的DSRs,簡(jiǎn)化為生產(chǎn)準(zhǔn)備的構(gòu)建、基于JVM的工作負(fù)荷等。 Spring boot是Spring IO提供的執(zhí)行層DSRs之一,還有一個(gè)DSRs是Grails。
有兩種方法可以用來(lái)構(gòu)建Spring應(yīng)用程序:使用spring boot和直接使用spring io。
需要注意的是,通常每當(dāng)新的Spring框架版本發(fā)布時(shí),都會(huì)伴隨著新的Spring boot版本,然后是新的sprint io版本發(fā)布。
2015年11月,Spring io 2.0.0發(fā)布。版本提供了新的模塊和依賴關(guān)系,包括Spring Boot 1.3。2016年7月,Spring io團(tuán)隊(duì)決定使用按字母順序的版本方案。 Spring IO使用城市名稱為大版本,用一個(gè)字母來(lái)表示小版本。因此,根據(jù)所使用的各個(gè)組件,你的應(yīng)用程序可能需要選擇合宜版本。一個(gè)新名稱發(fā)布的,表示一個(gè)維護(hù)版本發(fā)布,你可以在不影響代碼的使用。
2016年9月,首個(gè)按字母順序排列和城市命名的Spring io平臺(tái)版本Athens發(fā)布了。它包含sprint boot 1.4和其他第三方庫(kù)升級(jí)。此后,Athens發(fā)布了多個(gè)服務(wù)版本(SR1,SR2,SR3和SR4)。
2017年3月, spring io平臺(tái)Brussels -SR1發(fā)布。它使用最新的spring boot版本1.5.2.RELEASE。
目前最新版本為Brussels-SR7,于2018年1月31日發(fā)布,下一個(gè)版本Cairo-RC1也在提供了初步使用版本,支持模塊如下: