Spring-boot原理(附帶實現(xiàn)一個spring-boot-starter實例)附源碼下載

我就是個封面

Spring-boot自出現(xiàn)后匆绣,到現(xiàn)在火的很,大家貌似都在用什黑,連招聘里面也要求會這個崎淳。但是說實話,spring-boot無外乎想實現(xiàn)一種可插拔的編程方式愕把,說是簡化配置拣凹,其實并沒有減少多少,只不過把配置落到代碼里面恨豁,通過各種annotation來標示了嚣镜。

作為個人其實不太愿意團隊用spring-boot這種層層封裝的方式,各種jar鋪天蓋地圣絮,最終大家都被綁架了祈惶,自己底層的能力不一定有什么提高雕旨。

spring-boot的starter又是個什么鬼扮匠?
一句話捧请,spring-boot的starter是一個通過maven完成自包含并通過annotation配置使得可被spring上下文發(fā)現(xiàn)并實例化的一個可插拔的組件或服務(wù)。

spring-boot有兩種starter

一種是內(nèi)部已經(jīng)支持的棒搜,一種是第三方的疹蛉。

內(nèi)部支持starter:

其通過@ConditionalOnClass來實決定是否例化(ConditionalOnClass是指當在classpath發(fā)現(xiàn)需要的依賴的類時實例化),想要啟動這個服務(wù)力麸,只要要配置上對應(yīng)的starter可款,這個starter就能把所需要的jar給關(guān)聯(lián)上。

類似于我們對log的使用克蚂,默認使用slf4j這個api接口闺鲸,提供一個鉤子,classpath里面誰實現(xiàn)了這個機構(gòu)埃叭,誰就掛到這個鉤子上成為log具體實現(xiàn)摸恍,其中l(wèi)og4j就是一個實現(xiàn)。

通過spring的如下maven配置即可看見里面已經(jīng)通過dependencyManagement(這個時maven的依賴管理赤屋,不用的時候不會加載)給你配置好了所有內(nèi)置starter立镶。只需要用的時候把對應(yīng)的starter依賴配置上就行了。

<dependency>

?<groupId>org.springframework.boot</groupId>

?<artifactId>spring-boot-starter</artifactId> <

/dependency>

所有的starter其實都是要通過代碼配置被上下文發(fā)現(xiàn)的类早,可以在spring-boot-autoconfigure-xxx.jar去看媚媒,如下:。

內(nèi)置的tomcat涩僻,jetty也在里面:

具體代碼:

通過ConditionalOnClass只要發(fā)現(xiàn)了tomcat這個類(配置了spring-boot-starter-web的maven依賴后就會會有)缭召,就會啟動tomcat的服務(wù)。

第三方starter:

比如mybatis等逆日。

原理是一樣的恼琼,就是在你已經(jīng)實現(xiàn)的服務(wù)代碼之上封裝一層配置代碼就行,看看mybitis的屏富,這是mybatis-spring-boot-starter的依賴晴竞。

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.3.0</version>

</dependency>

這個依賴是一個pom,點進去可以看見自包含的依賴關(guān)系狠半,其中一個就是mybatis的autoConfigure噩死,通過@bean等annotation完成對mybatis的實例化配置,如下:

maven 自包含

具體代碼:

配置注入

基于這個機制,我們自己也可以實現(xiàn)一個

本次實現(xiàn)一個簡單的數(shù)據(jù)庫操作組件神年,類似于mybatis已维,只不過只實現(xiàn)了簡單的查詢服務(wù)。

整個示例有兩個工程:

一個實現(xiàn)我們自己的starter(取名叫spring-boot-mydao-starter)已日,最后會打成ar包垛耳,并install到本地maven本地廠庫里。

另外一個工程用于測試,最終會依賴spring-boot-mydao-starter整個組件堂鲜,并調(diào)用里面的查詢服務(wù)去測試栈雳。

工程

具體類如下:

1、創(chuàng)建spring-boot-mydao-starter工程缔莲,添加相關(guān)依賴配置

我們實現(xiàn)的這個組件僅僅依賴于mysql的驅(qū)動以及spring-boot的上下文環(huán)境哥纫。其中mysql驅(qū)動用的spring-boot-starter-parent里面配置好的,這里直接用即可痴奏,maven配置如下:

maven配置


2蛀骇、實現(xiàn)以下幾個類:

Mydao:封裝數(shù)據(jù)庫的連接和查詢服務(wù),和spring沒有任何關(guān)系读拆。

MyDaoAutoConfiguration:提供MyDao的配置用于啟動時被spring上下文發(fā)現(xiàn)并解析擅憔。

DbProperties:完成對數(shù)據(jù)庫配置參數(shù)文件的讀取(db.properties檐晕,當然spring-boot也支持其他格式的配置文件雕欺,個人還是喜歡傳統(tǒng)樣式)。

其中Mydao:

mydao

MyDaoAutoConfiguration(將配置參數(shù)對象傳給Mydao并配置Mydao實例):

Spring在啟動時會通過@Bean實例化Mydao并將其放入ConfigurableApplicationContext容器中棉姐。

配置文件類DbProperties:

自動讀取classpath下的db.properties的配置文件屠列,并實例化成類對象。配置文件需要在測試的工程(test-spring-boot-mydao-starter)里提供伞矩。

DbProperties

配置文件db.properties

配置文件

以上就是真?zhèn)€starter的類容笛洛。下面描述如何使用這個starter。

新建測試工程test-spring-boot-mydao-starter(起啥名都行)乃坤。配置上對我們的starter的依賴:

因為starter里面已經(jīng)依賴了spring-boot的上下文苛让,所以這里就不用配置了。

maven配置

然后就是測試:

我們用mysql自帶的數(shù)據(jù)庫里面的user表做測試湿诊。以下是測試類狱杰,需要注入starter里面的mydao:

測試類

然后就是啟動測試:

也可以用spring的junit來測試。

測試啟動

~以上便是本次分享所有內(nèi)容~

源碼下載

為防止地址失效厅须,所有下載鏈接都在公眾號維護仿畸,請關(guān)注公眾號后,回復(fù)“R003” 獲取完整源碼朗和。

公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末错沽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子眶拉,更是在濱河造成了極大的恐慌千埃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忆植,死亡現(xiàn)場離奇詭異放可,居然都是意外死亡谒臼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門耀里,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈缤,“玉大人,你說我怎么就攤上這事备韧。” “怎么了痪枫?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵织堂,是天一觀的道長。 經(jīng)常有香客問我奶陈,道長易阳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任吃粒,我火速辦了婚禮潦俺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徐勃。我一直安慰自己事示,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布僻肖。 她就那樣靜靜地躺著肖爵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪臀脏。 梳的紋絲不亂的頭發(fā)上劝堪,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音揉稚,去河邊找鬼秒啦。 笑死,一個胖子當著我的面吹牛搀玖,可吹牛的內(nèi)容都是我干的余境。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灌诅,長吁一口氣:“原來是場噩夢啊……” “哼葛超!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起延塑,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤绣张,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后关带,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侥涵,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡沼撕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芜飘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务豺。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拨扶,死狀恐怖于样,靈堂內(nèi)的尸體忽然破棺而出蚣抗,到底是詐尸還是另有隱情摧玫,我是刑警寧澤辽慕,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布寒瓦,位于F島的核電站逛拱,受9級特大地震影響邻遏,放射性物質(zhì)發(fā)生泄漏诗良。R本人自食惡果不足惜汹桦,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鉴裹。 院中可真熱鬧舞骆,春花似錦、人聲如沸径荔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽总处。三九已至赂蠢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辨泳,已是汗流浹背虱岂。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菠红,地道東北人第岖。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像试溯,于是被迫代替她去往敵國和親蔑滓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容