2004年3月24日,Spring官網(wǎng)發(fā)布了Spring Framework的1.0版本骗随,在一定程度上顛覆了Java開發(fā)的模式蛤织。Spring Framework提供的控制反轉(zhuǎn)和依賴注入,這兩個概念的提出也是受到了JNDI和EJB的容器注入的影響鸿染。換句話說指蚜,Spring Framework其實也是在J2EE的基礎(chǔ)上又建了一個輪子而已。從當(dāng)時的分層來看牡昆,Struts為web表示層姚炕、Hibernate為持久層,而Spring Framework就是把大家伙整合到一起的那么個作用丢烘。此時的Spring Framework還有一個致命的問題,Spring Framework需要隨著Java容器的啟動而裝載些椒。
那么在Spring Framework4.0發(fā)布的時候播瞳,Spring還同時發(fā)布了Spring Boot。官方是這么定義Spring Boot的免糕。
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.
Spring Boot使構(gòu)建獨(dú)立的Spring生產(chǎn)級別的項目變得簡單赢乓,同時提供了固化視圖來固化Spring Boot所依賴的Spring平臺庫和第三方類庫,從而減少管理類庫的煩惱石窑。大多數(shù)Spring Boot項目只需要少量的Spring配置牌芋。
1.Create stand-alone Spring applications
2.Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
3.Provide opinionated 'starter' dependencies to simplify your build configuration
4.Automatically configure Spring and 3rd party libraries whenever possible
5.Provide production-ready features such as metrics, health checks, and externalized configuration
6.Absolutely no code generation and no requirement for XML configuration
官網(wǎng)中也同時給出了Spring Boot的六大特性,分別是:
1.創(chuàng)建獨(dú)立的Spring應(yīng)用松逊;
2.直接嵌入Tomcat躺屁、Jetty或Undertow(不需要部署WAR文件);
3.提供固化的“Starter”依賴经宏,簡化構(gòu)建的配置步驟犀暑;
4.自動裝配Spring或第三方類庫;
5.提供運(yùn)維特性烁兰,比如指標(biāo)信息耐亏、健康檢查和配置外部化;
6.絕無代碼生成沪斟,而且不需要配置XML文件广辰。
從官網(wǎng)的說明中,我們不難看出,Spring Boot的優(yōu)點(diǎn):
使編碼變的簡單
使配置變的簡單
使部署變的簡單
使監(jiān)控變的簡單
怎么就簡單了择吊?
很久很久以前(其實也沒那么久):
做Spring項目開發(fā)時李根,程序員要知道配置哪些類來讓Hibernate和Spring一起工作,還要知道如何配置view resolver來控制哪個模版進(jìn)行視圖層的展示干发。寫了一大堆代碼其實只是在處理Spring框架本身的配置朱巨,此時一行業(yè)務(wù)邏輯都沒有寫。開發(fā)完成之后枉长,還要考慮部署的問題冀续,比如如何配置容器,如何修改配置文件等等必峰。而且在多應(yīng)用部署到同一個Tomcat的時候洪唐,經(jīng)常會出現(xiàn)沖突。就算花了很大力氣解決了這些問題吼蚁,程序部署成功之后凭需,也很難去了解這個程序的運(yùn)行狀態(tài)。那么還要配置第三方工具來了解應(yīng)用程序運(yùn)行狀態(tài)肝匆,參數(shù)粒蜈,環(huán)境變量。盡管Spring幫我們解決了依賴注入的問題旗国,簡化了MVC的流程枯怖,但是Spring框架本身集成了越來越多東西,導(dǎo)致其越來越難配置能曾,維護(hù)成本成直線上升度硝。
現(xiàn)在
Spring Boot使用“約定優(yōu)于配置”的理念讓項目快速運(yùn)行起來。簡單描述就是項目中存在大量的配置寿冕,此外還內(nèi)置一個習(xí)慣性的配置蕊程,讓我們無須手動進(jìn)行配置。使用Spring Boot 很容易創(chuàng)建一個獨(dú)立運(yùn)行驼唱、準(zhǔn)生產(chǎn)級別的Spring項目藻茂,而且我們幾乎不用怎么進(jìn)行配置。
約定優(yōu)于配置
約定優(yōu)于配置(Convention Over Configuration)曙蒸,也稱作按約定編程捌治,是一種軟件設(shè)計范式,旨在減少軟件開發(fā)人員需做決定的數(shù)量纽窟、獲得簡單的好處肖油,而又不失靈活性。
本質(zhì)上說臂港,開發(fā)人員僅需規(guī)定應(yīng)用中不符約定的部分森枪。例如视搏,如果模型中有個名為 User 的類德挣,那么數(shù)據(jù)庫中對應(yīng)的表就會默認(rèn)命名為 user解幽。只有在偏離這一約定時,例如將該表命名為“l(fā)egal_user”底桂,才需寫有關(guān)這個名字的配置式散。
我們可以按照這個思路來設(shè)想筋遭,我們約定 Controller 層就是 Web 請求層可以省略 MVC 的配置;我們約定在 Service 結(jié)尾的類自動注入事務(wù)暴拄,就可以省略了 Spring 的切面事務(wù)配置漓滔。
在 Spring 體系中,Spring Boot JPA 就是約定優(yōu)于配置最佳實現(xiàn)之一乖篷,不需要關(guān)注表結(jié)構(gòu)响驴,我們約定類名即是表名,屬性名即是表的字段撕蔼,String 對應(yīng) varchar豁鲤,long 對應(yīng) bigint,只有需要一些特殊要求的屬性鲸沮,我們再單獨(dú)進(jìn)行配置琳骡,按照這個約定我們可以將以前的工作大大簡化。
Spring Boot 體系將約定優(yōu)于配置的思想展現(xiàn)得淋漓盡致讼溺,小到配置文件日熬、中間件的默認(rèn)配置,大到內(nèi)置容器肾胯、生態(tài)中的各種 Starters 無不遵循此設(shè)計規(guī)則。Spring Boot 鼓勵各軟件組織方創(chuàng)建自己的 Starter耘纱,創(chuàng)建 Starter 的核心組件之一就是 autoconfigure 模塊敬肚,也是 Starter 的核心功能,在啟動的時候進(jìn)行自動裝配束析,屬性默認(rèn)化配置艳馒。
可以說正是因為 Spring Boot 簡化了配置和眾多的 Starters 才讓 Spring Boot 變得簡單、易用员寇、快速上手弄慰。Spring Boot 約定優(yōu)于配置的思想讓 Spring Boot 項目非常容易上手。
Spring Boot 都市傳說
一切一切的起點(diǎn)
2002 年 10 月蝶锋,Rod Johnson 撰寫了一本名為 Expert One-on-One J2EE 設(shè)計和開發(fā)的書陆爽。本書當(dāng)時由 Wrox出版社出版,介紹了當(dāng)時 Java 企業(yè)應(yīng)用程序開發(fā)的情況扳缕,并指出了 Java EE 和 EJB 組件框架中的存在的一些主要缺陷慌闭。在這本書中别威,他提出了一個基于普通 Java 類和依賴注入的更簡單的解決方案。(這里就對應(yīng)了我們開篇講到的驴剔,依賴注入并不是Spring發(fā)明的省古,而是在J2EE原來的基礎(chǔ)上做了優(yōu)化改進(jìn))
在書中,他展示了如何在不使用 EJB 的情況下構(gòu)建高質(zhì)量丧失,可擴(kuò)展的在線座位預(yù)留系統(tǒng)豺妓。為了構(gòu)建應(yīng)用程序,他編寫了超過 30,000 行的基礎(chǔ)結(jié)構(gòu)代碼布讹。包含許多可重用的 Java 接口和類琳拭,如 ApplicationContext和BeanFactory。由于java接口是依賴注入的基本構(gòu)建塊炒事,因此他將這些類的根包命名為com.interface21臀栈。
Spring 誕生
在本書發(fā)布后不久,開發(fā)者 Juergen Hoeller 和 Yann Caroff 說服 Rod Johnson 創(chuàng)建一個基于基礎(chǔ)結(jié)構(gòu)代碼的開源項目挠乳。Rod权薯,Juergen 和 Yann 于 2003 年 2 月左右開始合作開發(fā)該項目 。Yann 為新框架創(chuàng)造了“Spring”的名字睡扬。
2004 年 3 月盟蚣,1.0 版發(fā)布。有趣的是卖怜,在1.0發(fā)布之前屎开,spring 就被開發(fā)人員廣泛采用。2004 年 8 月马靠,Rod Johnson奄抽,Juergen Hoeller,Keith Donald 和Colin Sampaleanu 共同創(chuàng)立了一家專注于 Spring 咨詢甩鳄,培訓(xùn)和支持的公司: interface21逞度。
Yann Caroff 在很早離開了團(tuán)隊,Rod Johnson 在 2012 年離開妙啃,Juergen Hoeller 目前仍然還在團(tuán)隊中進(jìn)行開發(fā)工作档泽。自 2004 年 1.0 版本發(fā)布以來,Spring 框架迅速發(fā)展揖赴。Spring 2.0 于 2006 年 10 月發(fā)布馆匿,Spring的下載量超過了 100 萬。Spring 2.0 具有可擴(kuò)展的 XML 配置功能燥滑,用于簡化 XML 配置渐北,支持 Java 5,額外的 IoC 容器擴(kuò)展點(diǎn)突倍,支持動態(tài)語言腔稀。
在 Rod 領(lǐng)導(dǎo)下管理 Interface21 項目于 2007 年 11 月更名為 SpringSource盆昙。同時發(fā)布了 Spring 2.5。Spring 2.5 中的主要新功能包括支持 Java 6 / Java EE 5焊虏,支持注釋配置淡喜,classpath 中的組件自動檢測和兼容 OSGi 的 bundle。
2007 年诵闭,SpringSource 從基準(zhǔn)資本獲得了 A 輪融資(1000萬美元)炼团。SpringSource 在此期間收購了多家公司,如Hyperic疏尿,G2One 等瘟芝。2009年8月,SpringSource 以 4.2 億美元被 VMWare 收購褥琐。SpringSource 在幾周內(nèi)收購了云代工廠锌俱,這是一家云 PaaS 提供商。2015 年敌呈,云代工廠轉(zhuǎn)型成了非營利云代工廠贸宏。
2009 年 12 月,Spring 3.0 發(fā)布磕洪。Spring 3.0 具有許多重要特性吭练,如重組模塊系統(tǒng),支持 Spring 表達(dá)式語言析显,基于 Java 的 bean 配置(JavaConfig)鲫咽,支持嵌入式數(shù)據(jù)庫(如 HSQL,H2 和 Derby)谷异,模型驗證/ REST 支持和對 Java EE 的支持分尸。
2011 年和 2012 年發(fā)布了許多 3.x 系列的小版本。2012 年 7 月歹嘹,Rod Johnson 離開了團(tuán)隊寓落。
Spring Boot誕生
2012 年 10 月,Mike Youngstrom 在 Spring jira 中創(chuàng)建了一個功能請求 荞下, 要求在 Spring 框架中支持無容器 Web 應(yīng)用程序體系結(jié)構(gòu)。他談到了在主容器引導(dǎo) spring 容器內(nèi)配置 Web 容器服務(wù)史飞。(畫重點(diǎn)尖昏,Spring Boot 的苗頭發(fā)生了)
2013 年 4月,VMware 和 EMC 通過 GE 投資創(chuàng)建了一家名為 Pivotal 的合資企業(yè)构资。所有的 Spring 應(yīng)用項目都轉(zhuǎn)移到了 Pivotal抽诉。
2013 年 12 月,Pivotal 宣布發(fā)布 Spring 框架 4.0吐绵。Spring 4.0 是 Spring 框架的一大進(jìn)步迹淌,它包含了對Java 8 的全面支持河绽,更高的第三方庫依賴性(groovy 1.8+,ehcache 2.1+唉窃,hibernate 3.6+等)耙饰,Java EE 7 支持,groovy DSL for bean 定義纹份,對 websockets 的支持以及對泛型類型的支持作為注入 bean 的限定符苟跪。
2014 年 4 月,Spring Boot 1.0.0 發(fā)布蔓涧。改進(jìn)的模板支持件已,gemfire 支持,Elastic Search 和 Apache Solr 的自動配置元暴。
2015 年 3 月篷扩,Spring Boot 1.2 發(fā)布。升級到 servlet 3.1 / tomcat 8 / jetty 9茉盏,spring 4.1 升級鉴未,支持 banner / jms / SpringBootApplication 注解。
2016 年 12 月援岩,Spring Boot 1.3發(fā)布新的 spring-boot-devtools歼狼,用于緩存技術(shù)(ehcache,hazelcast享怀,redis 和 infinispan)的自動配置以及完全可執(zhí)行的 jar 支持羽峰。于此同時,Spring 4.2 升級添瓷。
2017年1月梅屉,Spring Boot 1.4 支持 couchbase / neo4j,分析啟動失敗和RestTemplateBuilder鳞贷。于此同時Spring 4.3 升級坯汤。
2017年2月,Spring Boot 1.5 支持 kafka / ldap搀愧,第三方庫升級惰聂,棄用 CRaSH 支持和執(zhí)行器記錄器端點(diǎn)以動態(tài)修改應(yīng)用程序日志級別。
2014 年至 2017 年期間發(fā)布了許多 Spring 框架 4.xx 系列版本咱筛。Spring 4.3.8 于 2017 年 4 月發(fā)布搓幌,并成為 4.x 系列中的最后一個。
2018 年 03 月迅箩,Spring Boot 2.0 基于 Java 8溉愁,支持 Java 9,支持 Quartz 饲趋,調(diào)度程序大大簡化了安全自動配置拐揭,支持嵌入式 Netty撤蟆。于此同時,Spring 5.0發(fā)布堂污。