毋庸置疑钓株,Spring Boot在眾多從事Java微服務(wù)開發(fā)的程序員群體中是一個(gè)很特別的存在餐禁。說它特別是因?yàn)樗_實(shí)簡(jiǎn)化了基于Spring技術(shù)棧的應(yīng)用/微服務(wù)開發(fā)過程氯析,使得我們能夠很快速地就搭建起一個(gè)應(yīng)用的腳手架并在其上進(jìn)行項(xiàng)目的開發(fā)弃锐,再也不用像以前那樣使用大量的XML或是注解了懦铺,應(yīng)用在這樣的約定優(yōu)于配置的前提下可以以最快的速度創(chuàng)建出來。
Spring Boot從這一點(diǎn)來說極大解放了開發(fā)者贯要,使得開發(fā)者從之前繁瑣的配置中解脫出來暖侨,轉(zhuǎn)而專注于應(yīng)用的業(yè)務(wù)邏輯開發(fā)。這樣崇渗,我們的系統(tǒng)的開發(fā)周期就會(huì)大大縮短字逗,交付周期也越來越頻繁了,這同樣也是Spring Boot為我們廣大開發(fā)者所帶來的巨大好處宅广。我們可以盡情享受這樣一個(gè)優(yōu)秀框架在方方面面所帶來的功能扳肛,甚至很多功能都可以做到開箱即用,只需在POM或是build.gradle中簡(jiǎn)單配置一下即可乘碑,相比于之前的Spring MVC等傳統(tǒng)的Web開發(fā)模式來說簡(jiǎn)化了太多太多。
總的來說金拒,Spring Boot在如下幾個(gè)方面為我們帶來了巨大的效能提升:
- 約定優(yōu)于配置兽肤。按照Spring Boot的方式進(jìn)行簡(jiǎn)單的配置后,功能就可以直接使用了绪抛。
- 自動(dòng)裝配资铡。Spring Boot在啟動(dòng)時(shí)會(huì)自動(dòng)探測(cè)類路徑下的各種類型,實(shí)現(xiàn)類型的自動(dòng)裝配幢码,無需開發(fā)者再通過XML或是注解進(jìn)行顯式的類型裝配了笤休,這一點(diǎn)要拜@EnableAutoConfiguration注解或是更為全面的@SpringBootApplication注解所賜。
- 內(nèi)嵌各種Servlet容器症副。Spring Boot內(nèi)嵌了Tomcat店雅、Jetty與Undertow等Servlet容器政基,使得我們可以像開發(fā)普通的Java應(yīng)用那樣直接通過main方法來啟動(dòng)容器,甚至可以直接通過jar包而非war包的形式就能夠?qū)崿F(xiàn)快速部署闹啦,不必再依賴于外部的Servlet容器沮明。
- yml配置的支持。yml或是yaml的全稱是YAML Ain't Markup Language的簡(jiǎn)稱(有意思的是窍奋,當(dāng)初在開發(fā)這門語言時(shí)荐健,其簡(jiǎn)稱實(shí)際上是Yet Another Markup Language),新的簡(jiǎn)稱采取了遞歸的方式琳袄。這種新的語言可以看作是傳統(tǒng)的properties配置文件的一種有益補(bǔ)充江场,它通過縮進(jìn)的方式來表示層次化的配置項(xiàng),相比于傳統(tǒng)的properties屬性文件來說窖逗,其層次感會(huì)更好一些址否;當(dāng)然,順便也可以讓我們少敲一些字母滑负。
- 提供了各種starter便于功能的開箱即用在张。圍繞著Spring Boot生態(tài)圈目前已經(jīng)涌現(xiàn)出了不計(jì)其數(shù)的starter,這樣我們只需將相應(yīng)的starter配置項(xiàng)引入到項(xiàng)目中即可很方便地使用對(duì)應(yīng)的功能矮慕。
- 提供了各種度量帮匾。Spring Boot提供了各種度量屬性,便于我們查看當(dāng)前項(xiàng)目的運(yùn)行情況以及系統(tǒng)使用情況痴鳄。
Spring Boot所提供的功能非常之多瘟斜,上面不過是列舉出了它諸多功能的幾個(gè)方面而已。
不過痪寻,這篇文章的主旨卻并不在Spring Boot所提供的如此之多的功能特性上螺句,而是從一個(gè)開發(fā)者視角來分析學(xué)習(xí)和使用Spring Boot時(shí)我們?cè)撊绾稳プ觯粨Q句話說橡类,我認(rèn)為正確的學(xué)習(xí)路徑和曲線應(yīng)該是怎樣的蛇尚。
下面是我經(jīng)過一段時(shí)間的仔細(xì)觀察,發(fā)現(xiàn)很多開發(fā)者在學(xué)習(xí)和使用Spring Boot時(shí)所存在的嚴(yán)重誤區(qū):
- Spring Boot非常方便顾画,簡(jiǎn)單取劫,拿來就用。這是Spring Boot自身的優(yōu)良特性給開發(fā)人員所帶來的最大的一個(gè)誤解研侣。誠然谱邪,在我們剛開始上手Spring Boot時(shí),只需要短短10分鐘左右的時(shí)間就能讓一個(gè)Web應(yīng)用運(yùn)行起來庶诡,這只要按照Spring Boot官方網(wǎng)站的示例跟著做下來即可惦银。當(dāng)這個(gè)簡(jiǎn)單的示例應(yīng)用成功運(yùn)行起來后,你會(huì)發(fā)現(xiàn)自己幾乎沒寫什么代碼,配置更是只是加上了幾個(gè)注解就行了扯俱。在這樣的前提下书蚪,應(yīng)用竟然就能正常運(yùn)行起來了,神不神奇蘸吓,牛不牛逼善炫。
于是,你認(rèn)為Spring Boot果然是神器啊库继,果然是簡(jiǎn)單啊箩艺,果然是方便啊。在這個(gè)示例的基礎(chǔ)上再增加點(diǎn)功能貌似也是比較輕松的宪萄,再加一個(gè)url mapping艺谆,嚯,可以訪問到了拜英,嘎嘎静汤。
所以,你得出了這樣一個(gè)結(jié)論:Spring Boot從入門到精通只需要一天時(shí)間即可居凶。
騷年虫给,你咋這么幼稚不成熟呢?
Spring Boot的本質(zhì)是什么侠碧?Spring Boot官網(wǎng)明確表示自己不提供任何新的特性與功能抹估,只是將之前傳統(tǒng)的基于Spring的開發(fā)進(jìn)行了簡(jiǎn)化,便于開發(fā)者上手弄兜。
看到了么药蜻,這里的要點(diǎn)是什么?
Spring復(fù)雜么替饿?當(dāng)然復(fù)雜了语泽,那為什么我們用Spring Boot進(jìn)行開發(fā)時(shí)卻感受不到這種復(fù)雜性呢?
答案當(dāng)然是Spring Boot將這種復(fù)雜性封裝起來了视卢。一個(gè)框架或是系統(tǒng)如果是復(fù)雜的踱卵,那么這種復(fù)雜性就會(huì)存在兩種地方:
將復(fù)雜性全部封裝起來,對(duì)使用者暴露簡(jiǎn)單的使用接口据过。
將復(fù)雜性暴露給使用者颊埃。
復(fù)雜系統(tǒng)無它,上述兩點(diǎn)而已蝶俱。
對(duì)于Spring Boot來說,顯然它采取的是第一種策略饥漫,即將復(fù)雜性封裝起來榨呆,向使用者暴露簡(jiǎn)單的接口,讓開發(fā)者能夠快速上手庸队。
但顯然积蜻,我們所開發(fā)的系統(tǒng)不可能是那么簡(jiǎn)單的闯割,它或多或少地需要使用很多其他很多技術(shù),當(dāng)這些技術(shù)被集成到Spring Boot中時(shí)竿拆,很多問題就開始暴露出來了宙拉,這時(shí)的你如果沒有扎實(shí)的基礎(chǔ),就會(huì)陷入遇到一個(gè)問題就到處搜結(jié)果的窘境丙笋,結(jié)果造成一天下來疲于搜索答案谢澈。經(jīng)過了一段時(shí)間,你可能會(huì)反問自己:這是我要的Spring Boot么御板?怎么感覺還不如使用傳統(tǒng)的Spring MVC開發(fā)速度快呢锥忿?
當(dāng)我們使用傳統(tǒng)的開發(fā)模式時(shí),大多數(shù)內(nèi)容都是我們自己來設(shè)置的怠肋;在這種情況下敬鬓,系統(tǒng)出現(xiàn)了問題后,我們能夠比較快地定位到問題所在笙各;然而钉答,在Spring Boot中,因?yàn)橐磺卸际亲詣?dòng)裝配的杈抢,因此一旦出現(xiàn)問題数尿,定位問題就是一個(gè)非常耗時(shí)耗力的事情。
- 學(xué)習(xí)Spring Boot不需要對(duì)Spring有太深入的了解和學(xué)習(xí)春感。一般來說砌创,但凡有這種想法的人大多數(shù)都是沒有接觸過傳統(tǒng)的Spring MVC或是Spring開發(fā)的年輕程序員,他們一上來使用的就是Spring Boot框架鲫懒,開發(fā)了幾個(gè)項(xiàng)目后就得出了這樣的結(jié)論嫩实。
在我們使用基于Spring技術(shù)棧的框架時(shí),無論使用的框架是什么窥岩,Spring永遠(yuǎn)都是基礎(chǔ)甲献,永遠(yuǎn)都處于根基的位置。沒有對(duì)Spring的深入理解和學(xué)習(xí)颂翼,你使用構(gòu)建于其上的任何框架都只不過是水中月晃洒,鏡中花而已,經(jīng)不起任何推敲朦乏。也許你對(duì)框架的API球及、類、方法都比較了解呻疹,知道怎么用吃引,但你有沒有想過,這些東西對(duì)于經(jīng)驗(yàn)豐富的Spring開發(fā)者來說,掌握起來速度其實(shí)是很快的镊尺,而且更加扎實(shí)朦佩。畢竟,Spring是這一切的根源庐氮,對(duì)于Spring有了深入的理解與認(rèn)知后语稠,再來反觀構(gòu)建于其上的各種應(yīng)用層框架,你會(huì)有完全不同的感受的弄砍。
Spring Boot的配置方式簡(jiǎn)單仙畦,更加優(yōu)越。我相信输枯,這也是很多開發(fā)者在使用Spring Boot時(shí)所得出的一個(gè)結(jié)論议泵。但是,我想問題的是桃熄,YAML真的就比properties強(qiáng)大很多么(當(dāng)然先口,Spring Boot對(duì)于這兩種方式都是支持的)。如果你的配置項(xiàng)很多瞳收,而且都放到了application.yml中時(shí)(特別地碉京,將各種profile配置也都放到了這里),那你再來看看你的yml文件螟深,你還會(huì)有良好的心情么谐宙?
Spring Boot項(xiàng)目一旦出現(xiàn)問題,特別是那種自動(dòng)配置出現(xiàn)問題界弧,或是同一個(gè)類型有幾個(gè)對(duì)應(yīng)項(xiàng)時(shí)凡蜻,排查起來不是那么容易的事情,尤其在項(xiàng)目規(guī)模比較龐大時(shí)更是如此垢箕。這就需要你對(duì)Spring Boot的底層有良好的掌握與認(rèn)知才能較快地找出問題所在划栓。
配置的加載。我相信很多做Spring Boot開發(fā)的程序員們都讀過網(wǎng)上關(guān)于Spring Boot配置信息加載優(yōu)先級(jí)的文章条获。姑且不論這些文章的正確與否忠荞,你是否真正理解了配置信息優(yōu)先級(jí)問題,Spring Boot是如何處理配置信息的加載優(yōu)先級(jí)的帅掘。
對(duì)Spring Boot的誤解太多委煤,這里面僅列出上述五條。
那么修档,問題到底出在哪里呢碧绞?顯然,問題的根源不在Spring Boot吱窝,那就在你自身嘍头遭。
還是那句話寓免,Spring Boot絕不是一個(gè)可以速成的框架,我們雖然可以快速上手Spring Boot计维,用它做一些簡(jiǎn)單的示例或是項(xiàng)目,但是當(dāng)項(xiàng)目規(guī)模變大時(shí)撕予,如果沒有良好的基礎(chǔ)鲫惶,你是無法很好地駕馭它的;Spring Boot絕非一個(gè)簡(jiǎn)單的框架实抡,它是諸多模式欠母、思想、經(jīng)驗(yàn)的集大成者吆寨。但赏淌,雖然它將復(fù)雜性隱藏了起來,我們?cè)趯?shí)際開發(fā)中依然會(huì)遇到形形色色的問題啄清,這時(shí)的你若是具備優(yōu)秀的Spring和Spring Boot基礎(chǔ)六水,那么問題的解決就是一個(gè)快速提升的過程,否則有些問題不是簡(jiǎn)單搜索一下網(wǎng)上資料就能搞得定的辣卒。
如果你做過大規(guī)模的Spring Boot項(xiàng)目掷贾,我相信你會(huì)認(rèn)同我上述的觀點(diǎn)的。
無它荣茫,唯手熟爾想帅。
Spring Boot是一個(gè)極為優(yōu)秀的框架,優(yōu)秀的框架需要我們也能配得上啡莉,這就需要我們首先將自己變成一個(gè)優(yōu)秀的Spring與Spring Boot開發(fā)者港准,探究本源,這樣才能得心應(yīng)手咧欣,行走在技術(shù)的前沿浅缸。
作者簡(jiǎn)介:張龍,系統(tǒng)架構(gòu)師该押,資深培訓(xùn)講師疗杉,圣思園教育創(chuàng)辦者,譯者蚕礼。譯有《復(fù)雜性思考》烟具、《iPhone游戲開發(fā)》、《精通lambda表達(dá)式:Java多核編程》奠蹬、《設(shè)計(jì)原本》朝聋、《Python并行編程手冊(cè)》等20余本譯作;喜好研究技術(shù)囤躁,對(duì)系統(tǒng)底層有濃厚的興趣冀痕。