我眼中的Spring Boot

毋庸置疑,Spring Boot在眾多從事Java微服務(wù)開發(fā)的程序員群體中是一個(gè)很特別的存在。說它特別是因?yàn)樗_實(shí)簡化了基于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中簡單配置一下即可,相比于之前的Spring MVC等傳統(tǒng)的Web開發(fā)模式來說簡化了太多太多。

總的來說,Spring Boot在如下幾個(gè)方面為我們帶來了巨大的效能提升:

  • 約定優(yōu)于配置。按照Spring Boot的方式進(jìn)行簡單的配置后,功能就可以直接使用了。
  • 自動(dòng)裝配。Spring Boot在啟動(dòng)時(shí)會(huì)自動(dòng)探測類路徑下的各種類型,實(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的簡稱(有意思的是,當(dāng)初在開發(fā)這門語言時(shí),其簡稱實(shí)際上是Yet Another Markup Language),新的簡稱采取了遞歸的方式。這種新的語言可以看作是傳統(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)目中即可很方便地使用對應(yīng)的功能。
  • 提供了各種度量。Spring Boot提供了各種度量屬性,便于我們查看當(dāng)前項(xiàng)目的運(yùn)行情況以及系統(tǒng)使用情況。

Spring Boot所提供的功能非常之多,上面不過是列舉出了它諸多功能的幾個(gè)方面而已。

不過,這篇文章的主旨卻并不在Spring Boot所提供的如此之多的功能特性上,而是從一個(gè)開發(fā)者視角來分析學(xué)習(xí)和使用Spring Boot時(shí)我們該如何去做;換句話說,我認(rèn)為正確的學(xué)習(xí)路徑和曲線應(yīng)該是怎樣的。

下面是我經(jīng)過一段時(shí)間的仔細(xì)觀察,發(fā)現(xiàn)很多開發(fā)者在學(xué)習(xí)和使用Spring Boot時(shí)所存在的嚴(yán)重誤區(qū):

  1. Spring Boot非常方便,簡單,拿來就用。這是Spring Boot自身的優(yōu)良特性給開發(fā)人員所帶來的最大的一個(gè)誤解。誠然,在我們剛開始上手Spring Boot時(shí),只需要短短10分鐘左右的時(shí)間就能讓一個(gè)Web應(yīng)用運(yùn)行起來,這只要按照Spring Boot官方網(wǎng)站的示例跟著做下來即可。當(dāng)這個(gè)簡單的示例應(yīng)用成功運(yùn)行起來后,你會(huì)發(fā)現(xiàn)自己幾乎沒寫什么代碼,配置更是只是加上了幾個(gè)注解就行了。在這樣的前提下,應(yīng)用竟然就能正常運(yùn)行起來了,神不神奇,牛不牛逼。

于是,你認(rèn)為Spring Boot果然是神器啊,果然是簡單啊,果然是方便啊。在這個(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)行了簡化,便于開發(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ù)雜性全部封裝起來,對使用者暴露簡單的使用接口。

將復(fù)雜性暴露給使用者。

復(fù)雜系統(tǒng)無它,上述兩點(diǎn)而已。

對于Spring Boot來說,顯然它采取的是第一種策略,即將復(fù)雜性封裝起來,向使用者暴露簡單的接口,讓開發(fā)者能夠快速上手。

但顯然,我們所開發(fā)的系統(tǒng)不可能是那么簡單的,它或多或少地需要使用很多其他很多技術(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í)耗力的事情。

  1. 學(xué)習(xí)Spring Boot不需要對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)都處于根基的位置。沒有對Spring的深入理解和學(xué)習(xí),你使用構(gòu)建于其上的任何框架都只不過是水中月,鏡中花而已,經(jīng)不起任何推敲。也許你對框架的API、類、方法都比較了解,知道怎么用,但你有沒有想過,這些東西對于經(jīng)驗(yàn)豐富的Spring開發(fā)者來說,掌握起來速度其實(shí)是很快的,而且更加扎實(shí)。畢竟,Spring是這一切的根源,對于Spring有了深入的理解與認(rèn)知后,再來反觀構(gòu)建于其上的各種應(yīng)用層框架,你會(huì)有完全不同的感受的。

  1. Spring Boot的配置方式簡單,更加優(yōu)越。我相信,這也是很多開發(fā)者在使用Spring Boot時(shí)所得出的一個(gè)結(jié)論。但是,我想問題的是,YAML真的就比properties強(qiáng)大很多么(當(dāng)然,Spring Boot對于這兩種方式都是支持的)。如果你的配置項(xiàng)很多,而且都放到了application.yml中時(shí)(特別地,將各種profile配置也都放到了這里),那你再來看看你的yml文件,你還會(huì)有良好的心情么?

  2. Spring Boot項(xiàng)目一旦出現(xiàn)問題,特別是那種自動(dòng)配置出現(xiàn)問題,或是同一個(gè)類型有幾個(gè)對應(yīng)項(xiàng)時(shí),排查起來不是那么容易的事情,尤其在項(xiàng)目規(guī)模比較龐大時(shí)更是如此。這就需要你對Spring Boot的底層有良好的掌握與認(rèn)知才能較快地找出問題所在。

  3. 配置的加載。我相信很多做Spring Boot開發(fā)的程序員們都讀過網(wǎng)上關(guān)于Spring Boot配置信息加載優(yōu)先級(jí)的文章。姑且不論這些文章的正確與否,你是否真正理解了配置信息優(yōu)先級(jí)問題,Spring Boot是如何處理配置信息的加載優(yōu)先級(jí)的。

對Spring Boot的誤解太多,這里面僅列出上述五條。

那么,問題到底出在哪里呢?顯然,問題的根源不在Spring Boot,那就在你自身嘍。

還是那句話,Spring Boot絕不是一個(gè)可以速成的框架,我們雖然可以快速上手Spring Boot,用它做一些簡單的示例或是項(xiàng)目,但是當(dāng)項(xiàng)目規(guī)模變大時(shí),如果沒有良好的基礎(chǔ),你是無法很好地駕馭它的;Spring Boot絕非一個(gè)簡單的框架,它是諸多模式、思想、經(jīng)驗(yàn)的集大成者。但,雖然它將復(fù)雜性隱藏了起來,我們在實(shí)際開發(fā)中依然會(huì)遇到形形色色的問題,這時(shí)的你若是具備優(yōu)秀的Spring和Spring Boot基礎(chǔ),那么問題的解決就是一個(gè)快速提升的過程,否則有些問題不是簡單搜索一下網(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ù)的前沿。


作者簡介:張龍,系統(tǒng)架構(gòu)師,資深培訓(xùn)講師,圣思園教育創(chuàng)辦者,譯者。譯有《復(fù)雜性思考》、《iPhone游戲開發(fā)》、《精通lambda表達(dá)式:Java多核編程》、《設(shè)計(jì)原本》、《Python并行編程手冊》等20余本譯作;喜好研究技術(shù),對系統(tǒng)底層有濃厚的興趣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容