跟我學Dubbo系列之Java SPI機制簡介

SPI 簡介

SPI 全稱為 (Service Provider Interface) ,是JDK內置的一種服務提供發(fā)現(xiàn)機制桥滨。 目前有不少框架用它來做服務的擴展發(fā)現(xiàn), 簡單來說,它就是一種動態(tài)替換發(fā)現(xiàn)的機制齐媒, 舉個例子來說蒲每, 有個接口,想運行時動態(tài)的給它添加實現(xiàn)喻括,你只需要添加一個實現(xiàn)邀杏,

通過一個簡單例子來說明SPI是如何使用的。 首先通過一張圖來看看唬血,用SPI需要遵循哪些規(guī)范望蜡,因為spi畢竟是JDK的一種標準。

而后拷恨,把新加的實現(xiàn)脖律,描述給JDK知道就行啦(通過改一個文本文件即可)公司內部,目前Dubbo框架就基于SPI機制提供擴展功能腕侄。

我們首先需要一個目錄小泉,META-INF\services 如下,最終的目錄路徑就像這樣:

文件名字為 接口/抽象類: 全名 文件內容: 接口/抽象類 實現(xiàn)類
就像這樣:com.spi.impl.TextHellocom.chaochao.spi.impl.ImageHello

實現(xiàn)類:

最后冕杠,來看看膏孟,如果使用SPI機制,客戶端代碼:

最后的輸出:Text Hello.Image Hello拌汇。

dubbo的擴展機制和java的SPI機制非常相似柒桑,但是又增加了如下功能:

1 可以方便的獲取某一個想要的擴展實現(xiàn),java的SPI機制就沒有提供這樣的功能

2 對于擴展實現(xiàn)IOC依賴注入功能:

舉例來說:接口A噪舀,實現(xiàn)者A1魁淳、A2。接口B与倡,實現(xiàn)者B1界逛、B2。

現(xiàn)在實現(xiàn)者A1含有setB()方法纺座,會自動注入一個接口B的實現(xiàn)者息拜,此時注入B1還是B2呢?都不是净响,而是注入一個動態(tài)生成的接口B的實現(xiàn)者B$Adpative少欺,該實現(xiàn)者能夠根據(jù)參數(shù)的不同,自動引用B1或者B2來完成相應的功能

3 對擴展采用裝飾器模式進行功能增強馋贤,類似AOP實現(xiàn)的功能

以下面的例子為例來分析下:

其中Protocol接口定義如下:

對應的實現(xiàn)者如下:

ExtensionLoader中含有一個靜態(tài)屬性:
ConcurrentMap, ExtensionLoader>EXTENSION_LOADERS = new ConcurrentHashMap, ExtensionLoader>();

用于緩存所有的擴展加載實例赞别,這里加載Protocol.class,就以Protocol.class為key配乓,創(chuàng)建的ExtensionLoader為value存儲到上述EXTENSION_LOADERS中

這里沒有進行任何的加載操作仿滔。

我們來看下惠毁,ExtensionLoader實例是如何來加載Protocol的實現(xiàn)類的:

1 先解析Protocol上的Extension注解的name,存至String cachedDefaultName屬性中,作為默認的實現(xiàn)

2 到類路徑下的加載 META-INF/services/com.alibaba.dubbo.rpc.Protocol文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末崎页,一起剝皮案震驚了整個濱河市鞠绰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飒焦,老刑警劉巖洞豁,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荒给,居然都是意外死亡丈挟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門志电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曙咽,“玉大人,你說我怎么就攤上這事挑辆±欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵鱼蝉,是天一觀的道長洒嗤。 經(jīng)常有香客問我,道長魁亦,這世上最難降的妖魔是什么渔隶? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮洁奈,結果婚禮上间唉,老公的妹妹穿的比我還像新娘。我一直安慰自己利术,他們只是感情好呈野,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著印叁,像睡著了一般被冒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轮蜕,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天昨悼,我揣著相機與錄音,去河邊找鬼肠虽。 笑死幔戏,一個胖子當著我的面吹牛,可吹牛的內容都是我干的税课。 我是一名探鬼主播闲延,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼韩玩!你這毒婦竟也來了垒玲?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤找颓,失蹤者是張志新(化名)和其女友劉穎合愈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體击狮,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡佛析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彪蓬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寸莫。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖档冬,靈堂內的尸體忽然破棺而出膘茎,到底是詐尸還是另有隱情,我是刑警寧澤酷誓,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布披坏,位于F島的核電站,受9級特大地震影響盐数,放射性物質發(fā)生泄漏棒拂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一玫氢、第九天 我趴在偏房一處隱蔽的房頂上張望着茸。 院中可真熱鬧,春花似錦琐旁、人聲如沸涮阔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敬特。三九已至,卻和暖如春牺陶,著一層夾襖步出監(jiān)牢的瞬間伟阔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工掰伸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留皱炉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓狮鸭,卻偏偏與公主長得像合搅,于是被迫代替她去往敵國和親多搀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容

  • 前面我們了解過了Java的SPI擴展機制灾部,對于Java擴展機制的原理以及優(yōu)缺點也有了大概的了解康铭,這里繼續(xù)深入一下D...
    加大裝益達閱讀 5,062評論 2 20
  • 一支穿云箭锁蠕,千軍萬馬來相見 兩副忠義膽夷野,刀山火海提命現(xiàn)。 關于友情荣倾,有太多太多的話可以說 少時年華的天真無邪悯搔、激情...
    歸期無夢閱讀 418評論 0 0
  • 愛是恒久忍耐 又有恩慈 ————《圣經(jīng)》
    火星小喵閱讀 144評論 0 0
  • 從8號到24號,從板凳球員到傳奇巨星逃呼,從不被人注意的黑人到世界矚目的名人鳖孤,他,就是我的偶像:科比·布萊恩特...
    洋洋2004閱讀 543評論 0 0
  • 張東輝抡笼,焦點初級第43期堅持原創(chuàng)分享第56天(2017.10.27) 今早聽晨讀苏揣,熙娟老師的話再一次感動了我。 熙...
    星悅傳奇閱讀 453評論 0 0