dubbo解析-SPI

提到dubbo必須提到SPI爆哑。網(wǎng)絡(luò)上有很多介紹SPI原理的文章呻待,我不多介紹了砰盐。我介紹一下SPI的流程肿仑。官方文檔介紹:

http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html

SPI提供了一種插件功能谈撒,對于服務(wù)組件可以替換腥泥。dubbo的各層中,除了服務(wù)代理層和配置層之外啃匿,其他層組件都可以使用SPI替換蛔外。

下面的流程圖以代碼ExtensionLoader.getExtensionLoader(Container.class).getExtension("spring")為例。


流程圖

上圖中提到的搜索文件和目錄可以參考代碼ExtensionLoader.loadExtensionClasses溯乒,這個方法指定了搜索目錄:

META-INF/dubbo/internal/

META-INF/dubbo/

META-INF/services/

搜索的文件名為ExtensionLoader.getExtensionLoader方法入?yún)⒌娜薅惷醒帷@缛雲(yún)ontainer.class,那么對應(yīng)的文件名是org.apache.dubbo.container.Container裆悄。

當(dāng)我們要搜索的內(nèi)容不在文件中時矛纹,比如搜索數(shù)據(jù)庫,可以重寫loadExtensionClasses方法查詢數(shù)據(jù)庫光稼。不過這樣我們需要修改源代碼或南。

文件org.apache.dubbo.container.Container里面的內(nèi)容如下:

spring=org.apache.dubbo.container.spring.SpringContainer

log4j=org.apache.dubbo.container.log4j.Log4jContainer

logback=org.apache.dubbo.container.logback.LogbackContainer

方法getExtension的入?yún)⑹俏募锩婷恳恍械忍柷懊娴闹怠?/p>

方法getExtensionLoader的入?yún)榻涌诤⒌龋褂肧PI加載對象,接口必須有SPI注解采够。SPI注解的value值表示要加載對象的默認(rèn)名字肄方。可以使用getDefaultExtension方法加載默認(rèn)名字對應(yīng)的對象蹬癌。比如Container接口默認(rèn)對象名字是spring权她,如果使用getDefaultExtension方法加載對象,那么和getExtension("spring")加載的對象是一樣的逝薪。

除了getDefaultExtension隅要,getExtension方法,還有g(shù)etActivateExtension和getAdaptiveExtension翼闽。

getActivateExtension可以加載多個對象拾徙,可以參考接口Filter。要求接口的實(shí)現(xiàn)類必須有Activate注解感局,如果注解的value和group與getActivateExtension入?yún)⒁恢履岱龋敲磄etActivateExtension方法會返回一個List集合。

getAdaptiveExtension方法一般會通過代碼生成模塊生成一個Adaptive類型的類询微,并實(shí)例化對象崖瞭。代碼生成是AdaptiveClassCodeGenerator類完成的。Adaptive類型的類方法需要有Adaptive注解撑毛,沒有Adaptive注解的方法在自動生成的代碼里面會拋出UnsupportedOperationException书聚。Adaptive類型的對象是自適應(yīng)對象,Adaptive注解的方法入?yún)⑹荱RL或者包含URL屬性的對象藻雌,Adaptive注解的value值為URL的屬性名雌续,屬性名對應(yīng)的值就是要加載的對象名,如果URL中不包含Adaptive注解指定的值胯杭,那么使用Adaptive類型類的接口的SPI注解的value值作為默認(rèn)值驯杜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市做个,隨后出現(xiàn)的幾起案子鸽心,更是在濱河造成了極大的恐慌,老刑警劉巖居暖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽频,死亡現(xiàn)場離奇詭異,居然都是意外死亡太闺,警方通過查閱死者的電腦和手機(jī)糯景,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莺奸,你說我怎么就攤上這事丑孩。” “怎么了灭贷?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵温学,是天一觀的道長。 經(jīng)常有香客問我甚疟,道長仗岖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任览妖,我火速辦了婚禮轧拄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讽膏。我一直安慰自己檩电,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布府树。 她就那樣靜靜地躺著俐末,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奄侠。 梳的紋絲不亂的頭發(fā)上卓箫,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音垄潮,去河邊找鬼烹卒。 笑死,一個胖子當(dāng)著我的面吹牛弯洗,可吹牛的內(nèi)容都是我干的旅急。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼牡整,長吁一口氣:“原來是場噩夢啊……” “哼藐吮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起果正,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炎码,失蹤者是張志新(化名)和其女友劉穎盟迟,沒想到半個月后秋泳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攒菠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年迫皱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡卓起,死狀恐怖和敬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戏阅,我是刑警寧澤昼弟,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站奕筐,受9級特大地震影響舱痘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜离赫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一芭逝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渊胸,春花似錦旬盯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至办成,卻和暖如春泡态,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迂卢。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工某弦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人而克。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓靶壮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親员萍。 傳聞我的和親對象是個殘疾皇子腾降,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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