dubbo spi機(jī)制與spring spi機(jī)制----spi機(jī)制(二)

從上一篇Java SPI 機(jī)制解析?可以知道 Java SPI 的一些劣勢(shì)讽膏。Dubbo 的擴(kuò)展點(diǎn)加載從 Java SPI 擴(kuò)展點(diǎn)發(fā)現(xiàn)機(jī)制加強(qiáng)而來脑奠。

SPI實(shí)際上是“接口+策略模式+配置文件”實(shí)現(xiàn)的動(dòng)態(tài)加載機(jī)制美澳。在系統(tǒng)設(shè)計(jì)中植影,模塊之間通耻剑基于接口編程扰路,不直接顯示指定實(shí)現(xiàn)類。一旦代碼里指定了實(shí)現(xiàn)類谒亦,就無法在不修改代碼的情況下替換為另一種實(shí)現(xiàn)竭宰。為了達(dá)到動(dòng)態(tài)可插拔的效果,java提供了SPI以實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)份招。



Dubbo的SPI


相關(guān)定義

ExtensionLoader切揭,是dubbo的SPI機(jī)制的查找服務(wù)實(shí)現(xiàn)的工具類,類似與Java的ServiceLoader脾还,可做類比伴箩。dubbo約定擴(kuò)展點(diǎn)配置文件放在classpath下的/META-INF/dubbo,/META-INF/dubbo/internal鄙漏,/META-INF/services目錄下嗤谚,配置文件名為接口的全限定名,配置文件內(nèi)容為配置名=擴(kuò)展實(shí)現(xiàn)類的全限定名怔蚌。

Demo走起~~~~~~~~~~~~~~

(1)接口和實(shí)現(xiàn)類

接口


實(shí)現(xiàn)類

(2)使用Dubbo SPI的方式通過接口找實(shí)現(xiàn)類方式

a- 定義約定好的文件夾?

META-INF/dubbo/internal

b- 定義接口文件?

com.jack.DistributedArchitecture

c- 配置實(shí)現(xiàn)類

springcloud=com.yjy.SpringCloudImpl

dubbo=com.yjy.DubboImpl

servicemesh=com.yjy.ServiceMeshImpl

(3)模板代碼

ExtensionLoader extensionLoader =ExtensionLoader.getExtensionLoader(DistributedArchitecture.class);

DistributedArchitecture distributedArchitecture =extensionLoader.getExtension("xxx"); // key

distributedArchitecture.solve("家源技術(shù)");

源碼走讀

instance = createExtension(name, wrap);
getExtensionClasses().get(name)
loadExtensionClasses


loadResource(extensionClasses, classLoader, resourceURL, overridden, excludedPackages)
loadClass(extensionClasses, resourceURL, Class.forName(clazz, true, classLoader), name, overridden)
this.saveInExtensionClass(extensionClasses, clazz, n, overridden);


Dubbo SPI應(yīng)用場(chǎng)景

dubbo的 Filter很钓、Protocol九默、Cluster绷跑、LoadBalance 等都是通過 SPI 的方式進(jìn)行拓展加載的力奋。

Spring中的SPI機(jī)制

Spring中提供了SPI機(jī)制,我們只需要在 META-INF/spring.factories 中配置接口實(shí)現(xiàn)類名籍胯,即可通過服務(wù)發(fā)現(xiàn)機(jī)制竟闪,在運(yùn)行時(shí)加載接口的實(shí)現(xiàn)類:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration

在 spring-boot-autoconfigure 模塊下,SpringBoot默認(rèn)就配置了很多接口的服務(wù)實(shí)現(xiàn):

配置好 spring.factories 文件后杖狼,我們就可以通過 SpringFactoriesLoader 動(dòng)態(tài)加載接口實(shí)現(xiàn)類了炼蛤,代碼如下:


模板代碼


SpringFactoriesLoader API

org.springframework.core.io.support.SpringFactoriesLoader就是Spring框架中的“ServiceLoader”,該類提供了下列功能:

類靜態(tài)成員常量 final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"

此常量定義了該工具類要從每個(gè)jar包中提取的工廠類定義屬性文件的相對(duì)路徑蝶涩。

類靜態(tài)方法 <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader)

此方法會(huì)讀取classpath上所有的jar包中的所有 META-INF/spring.factories 屬性文件理朋,找出其中定義的匹配類型 factoryClass 的工廠類絮识,然后創(chuàng)建每個(gè)工廠類的對(duì)象/實(shí)例,并返回這些工廠類對(duì)象/實(shí)例的列表嗽上。

類靜態(tài)方法 List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader)

此方法會(huì)讀取classpath上所有的jar包中的所有 META-INF/spring.factories 屬性文件次舌,找出其中定義的匹配類型 factoryClass 的工廠類,然后并返回這些工廠類的名字列表兽愤,注意是包含包名的全限定名彼念。

SpringFactoriesLoader 源碼


loadFactories


loadFactoryNames


SpringBoot2.7.0 自動(dòng)配置將不推薦使用spring.factories

SpringBoot 2.7 中,不再推薦使用/META-INF/spring.factories文件作為自動(dòng)配置類的配置文件烹看,所以對(duì)于有自定義Starter的開發(fā)者來說国拇,有時(shí)間要抓緊把這一變化改起來了洛史,因?yàn)樵赟pringBoot 3開始將移除對(duì)/META-INF/spring.factories的支持惯殊。

如果您已經(jīng)創(chuàng)建了自動(dòng)配置,那么應(yīng)該將注冊(cè)從META-INF/spring.factories轉(zhuǎn)移到一個(gè)名為META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports的新文件也殖。每一行都包含自動(dòng)配置的完全限定名土思。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忆嗜,隨后出現(xiàn)的幾起案子己儒,更是在濱河造成了極大的恐慌,老刑警劉巖捆毫,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闪湾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绩卤,警方通過查閱死者的電腦和手機(jī)途样,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來濒憋,“玉大人何暇,你說我怎么就攤上這事×萃裕” “怎么了裆站?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黔夭。 經(jīng)常有香客問我宏胯,道長,這世上最難降的妖魔是什么本姥? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任肩袍,我火速辦了婚禮,結(jié)果婚禮上扣草,老公的妹妹穿的比我還像新娘了牛。我一直安慰自己颜屠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布鹰祸。 她就那樣靜靜地躺著甫窟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛙婴。 梳的紋絲不亂的頭發(fā)上粗井,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音街图,去河邊找鬼浇衬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛餐济,可吹牛的內(nèi)容都是我干的耘擂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼絮姆,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼醉冤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起篙悯,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤蚁阳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸽照,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螺捐,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年矮燎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了定血。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漏峰,死狀恐怖糠悼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浅乔,我是刑警寧澤倔喂,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站靖苇,受9級(jí)特大地震影響席噩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贤壁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一悼枢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脾拆,春花似錦馒索、人聲如沸莹妒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨怠。三九已至,卻和暖如春蜈块,著一層夾襖步出監(jiān)牢的瞬間鉴腻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工百揭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爽哎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓器一,卻偏偏與公主長得像课锌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盹舞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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