dubbo源碼,ExtensionLoader.strategies屬性解析

首先看strategies 屬性的定義:

private static volatile LoadingStrategy[] strategies = loadLoadingStrategies();

點(diǎn)進(jìn)去看初始化方法:loadLoadingStrategies()

private static LoadingStrategy[] loadLoadingStrategies() {
    return java.util.stream.StreamSupport.stream(java.util.ServiceLoader.load(LoadingStrategy.class).spliterator(), false)
            .sorted()
            .toArray(LoadingStrategy[]::new);
}

加載過程解析
ServiceLoader.load方法迎罗,利用的是jdk自帶的spi機(jī)制睬愤,加載 LoadingStrategy類的實(shí)現(xiàn)類,
jdk的spi機(jī)制約定了纹安,接口實(shí)現(xiàn)類的描述文件存放位置為:META-INFO/services/尤辱,文件名稱為接口的全限定名,即 org.apache.dubbo.common.extension.LoadingStrategy厢岂,文件內(nèi)容如下:

org.apache.dubbo.common.extension.DubboInternalLoadingStrategy
org.apache.dubbo.common.extension.DubboLoadingStrategy
org.apache.dubbo.common.extension.ServicesLoadingStrategy

顯然光督,LoadingStrategy接口有三種實(shí)現(xiàn),因此塔粒,jdk的spi機(jī)制结借,會將這三個實(shí)現(xiàn)分別初始化,并以數(shù)組的方式填充到 strategies屬性中卒茬,也就是說船老,不同的屬性代表著不同的加載策略。

到這一步圃酵,strategies屬性就加載完成了柳畔。那么,strategies字段在哪里使用呢辜昵?

我們再來看這一段代碼:

private Map<String, Class<?>> loadExtensionClasses() {
    cacheDefaultExtensionName();

    Map<String, Class<?>> extensionClasses = new HashMap<>();

    for (LoadingStrategy strategy : strategies) {
        loadDirectory(extensionClasses, strategy.directory(), type.getName(), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages());
        loadDirectory(extensionClasses, strategy.directory(), type.getName().replace("org.apache", "com.alibaba"), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages());
    }

    return extensionClasses;
}

總結(jié):strategies中的每一項(xiàng)荸镊,代表著不同的spi加載策略,每一種加載策略堪置,都有相應(yīng)的目錄結(jié)構(gòu)躬存。因此dubbo通過遍歷strategies,來讀取某一個接口在所有策略下的所有實(shí)現(xiàn)類舀锨,并以k - v的方式緩存到extensionClasses中岭洲,但是到這一步,還僅僅讀取了實(shí)現(xiàn)類的class對象坎匿,而沒有進(jìn)行初始化盾剩。后續(xù)使用實(shí)現(xiàn)類時雷激,可以直接拿到class對象,而不需要再去讀取文件了告私。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屎暇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驻粟,更是在濱河造成了極大的恐慌根悼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀撑,死亡現(xiàn)場離奇詭異挤巡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酷麦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門矿卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沃饶,你說我怎么就攤上這事母廷。” “怎么了绍坝?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵徘意,是天一觀的道長。 經(jīng)常有香客問我轩褐,道長椎咧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任把介,我火速辦了婚禮勤讽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拗踢。我一直安慰自己脚牍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布巢墅。 她就那樣靜靜地躺著诸狭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪君纫。 梳的紋絲不亂的頭發(fā)上驯遇,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音蓄髓,去河邊找鬼叉庐。 笑死,一個胖子當(dāng)著我的面吹牛会喝,可吹牛的內(nèi)容都是我干的陡叠。 我是一名探鬼主播玩郊,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枉阵!你這毒婦竟也來了译红?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兴溜,失蹤者是張志新(化名)和其女友劉穎临庇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昵慌,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年淮蜈,在試婚紗的時候發(fā)現(xiàn)自己被綠了斋攀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡梧田,死狀恐怖淳蔼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裁眯,我是刑警寧澤鹉梨,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站穿稳,受9級特大地震影響存皂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逢艘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一旦袋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧它改,春花似錦疤孕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲜戒,卻和暖如春专控,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袍啡。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工踩官, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人境输。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓蔗牡,卻偏偏與公主長得像颖系,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辩越,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348