深入剖析Spring boot自動裝配原理一(SPI)

在了解Spring boot自動裝配原理之前夹抗,需要了解兩個很重要的知識點Java SPI機制和Spring的Import注解断凶,把這兩個重要的點理解清楚之后就很容易理解Spring boot的自動裝配原理了空猜,并且能很好的應(yīng)用到實際項目中湾盗。

?

前言

SPI(Service Provider Interface)崇渗,是JDK內(nèi)置的一種?服務(wù)提供發(fā)現(xiàn)機制旋廷,可以用來啟用框架擴展和替換組件泳唠,主要是被框架的開發(fā)人員使用狈网,比如java.sql.Driver接口,其他不同廠商可以針對同一接口做出不同的實現(xiàn)警检,MySQL和PostgreSQL都有不同的實現(xiàn)提供給用戶孙援,而Java的SPI機制可以為某個接口尋找服務(wù)實現(xiàn)。Java中SPI機制主要思想是將裝配的控制權(quán)移到程序之外扇雕,在模塊化設(shè)計中這個機制尤其重要拓售,其核心思想就是?解耦。大家最熟悉的的應(yīng)用場景有Common-Logging镶奉,JDBC等础淤。

?

JDK實現(xiàn)

1崭放、定義SPI接口

2、SPI接口的多個實現(xiàn)

?

3鸽凶、在classpath下創(chuàng)建META-INF/services/目錄币砂,并且在該目錄下創(chuàng)建一個文件配置文件com.qd.demo.spi.AnimalSPI(該文件名為SPI接口全路徑)

?

文件中的內(nèi)容為SPI接口具體的實現(xiàn)類(可多個)

4、通過jdk中ServiceLoader讀取配置文件對SPI實現(xiàn)類形式實例化

?

通過該過程可以了解到SPI是面向接口編程玻侥,不關(guān)注接口的具體實現(xiàn)决摧,由配置文件配置具體要實例化的廠商接口。JDK也提供了具體的實現(xiàn)凑兰,我們一起來看看ServiceLoader是如何實現(xiàn)的掌桩,通過load方法跟入JDK源碼(以下至列出核心代碼)。

?

?

重點關(guān)注PREFIX = "META-INF/services/"姑食、hasNextService方法和nextService方法波岛,首先在classpath下的META-INF/services/找到SPI接口classname的對應(yīng)的配置文件,然后將其所有配置的類讀取到configs中音半,在通過反射的方式對配置的bean進行實例化则拷,由此就解開了SPI 對應(yīng)bean的具體實例化過程。

不足:

不能按需加載曹鸠,需要遍歷配置文件中所有的實現(xiàn)并實例化煌茬。

不能很直接的獲取某個實例化對象,只能通過迭代的形式獲取彻桃。

?非線程安全宣旱。

Spring 實現(xiàn)

Spring主要通過SpringFactoriesLoader來進行實現(xiàn)

?

?

Spring通過classpath下META-INF/spring.factories配置文件,找到需要實例化的類進行實例化叛薯,其讀取配置文件方式與jdk一致,但是比jdk更優(yōu)勢的地方是能指定bean進行實例化笙纤,如截圖就指定了BeanInfoFactory的實例化子類為ExtendedBeanInfoFactory耗溜。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市省容,隨后出現(xiàn)的幾起案子抖拴,更是在濱河造成了極大的恐慌,老刑警劉巖腥椒,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阿宅,死亡現(xiàn)場離奇詭異,居然都是意外死亡笼蛛,警方通過查閱死者的電腦和手機洒放,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滨砍,“玉大人往湿,你說我怎么就攤上這事妖异。” “怎么了领追?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵他膳,是天一觀的道長。 經(jīng)常有香客問我绒窑,道長棕孙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任些膨,我火速辦了婚禮蟀俊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傀蓉。我一直安慰自己欧漱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布葬燎。 她就那樣靜靜地躺著误甚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谱净。 梳的紋絲不亂的頭發(fā)上窑邦,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音壕探,去河邊找鬼冈钦。 笑死,一個胖子當(dāng)著我的面吹牛李请,可吹牛的內(nèi)容都是我干的瞧筛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼导盅,長吁一口氣:“原來是場噩夢啊……” “哼较幌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起白翻,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤乍炉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后滤馍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛琼,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年巢株,在試婚紗的時候發(fā)現(xiàn)自己被綠了槐瑞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡阁苞,死狀恐怖随珠,靈堂內(nèi)的尸體忽然破棺而出灭袁,到底是詐尸還是另有隱情,我是刑警寧澤窗看,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布茸歧,位于F島的核電站,受9級特大地震影響显沈,放射性物質(zhì)發(fā)生泄漏软瞎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一拉讯、第九天 我趴在偏房一處隱蔽的房頂上張望涤浇。 院中可真熱鬧,春花似錦魔慷、人聲如沸只锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜻展。三九已至,卻和暖如春邀摆,著一層夾襖步出監(jiān)牢的瞬間纵顾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工栋盹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留施逾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓例获,卻偏偏與公主長得像汉额,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子榨汤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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