Dubbo原始碼分析之SPI(二)

2021-10-01 12:51:39 字數 2143 閱讀 9191

本篇文章是dubbo spi原始碼分析的第二篇,接著第一篇繼續分析dubbo spi的內容,我們主要介紹 getdefaultextension() 獲取預設擴充套件點方法。

由於此方法比較簡單,我們略過示例部分,直接分析原始碼。

獲取預設擴充套件方法getdefaultextension()是乙個public、可對外提供呼叫的方法。我們知道,dubbo中擴充套件點介面必須要有@spi註解修飾,@spi註解**如下:

1

@documented

2@retention(retentionpolicy.runtime)

3@target()

4public @inte***ce

spi

註解可以修飾類和介面,同時提供 乙個預設為空的value欄位。

這個value欄位 就是本篇文章要介紹的預設擴充套件實現。

現在我們來看getdefaultextension()方法內部:

1

public

t getdefaultextension()

7return

getextension(cacheddefaultname);

8 }

第二行方法 getextensionclasses()是載入配置文字檔案,獲取配置的擴充套件點實現類,方法執行完,會把配置文字檔案的key和擴充套件點實現類的class物件儲存在cachedclasses 成員變數中,這個我們在第一篇已經介紹過。

接下來就是方法的關鍵點,成員變數cacheddefaultname 的判斷了,如果cacheddefaultname 為空或為」true「 直接返回 null,如果cacheddefaultname 不為空,則呼叫getextension(..)方法,返回擴充套件點實現類物件。這個方法我們在第一篇也已經介紹了。現在我們只需要分析cacheddefaultname的賦值點 就ok 了。

成員變數cacheddefaultname 我們在第一篇有介紹到,不知道大家是否還有印象,我們現在看看變數定義:

1

//spi()內value,預設的介面實現

2private string cacheddefaultname;

私有的字串變數。

1 getdefaultextension() -->getextensionclasses()-->loadextensionclasses()

這幾個方法我們都有介紹,我們現在看看loadextensionclasses():

1

private map>loadextensionclasses()

15if (names.length == 1)

16 cacheddefaultname = names[0];17}

18}19//

載入三個目錄配置的擴充套件類

20 map> extensionclasses = new hashmap>();

21//

meta-inf/dubbo/internal

22loaddirectory(extensionclasses, dubbo_internal_directory);

23//

meta-inf/dubbo

24loaddirectory(extensionclasses, dubbo_directory);

25//

meta-inf/services/

26loaddirectory(extensionclasses, services_directory);

27return

extensionclasses;

28 }

沒錯,對cacheddefaultname的賦值,僅此一出。

cacheddefaultname的內容就是解析@spi註解的value內容。此處賦值後,getdefaultextension()方法的返回就是根據這個值進行擴充套件點獲取並返回的。

獲取預設擴充套件點的方法getdefaultextension() 邏輯很簡單,就是解析出註解@spi的value內容,通過前一篇介紹的getextension(..)方法進行擴充套件點獲取。如果@spi沒有配置value或者設定的是」true「,getdefaultextension()方法返回的就是null。

Dubbo原始碼解析之SPI

dubbo版本 2.5.4 dubbo在服務發布過程中缺省會載入自適應的協議擴充套件,在類serviceconfig中存在以下初始化 下面以此進行spi過程分析。private static final protocol protocol extensionloader.getextensionlo...

dubbo原始碼解析 spi 五

之前對dubbo的spi進行了四篇的分享.大家對這個概念有了一些初步的了解.談到程式設計水平如何高階,大家可能都會異口同聲的說出三個字,看原始碼.但是我卻始終認為,程式設計光看,是永遠學不會的.關鍵還是要多動手.但是很多時候,連怎麼看原始碼都無從下手,你叫我寫仿寫原始碼,這不是開玩笑?我們可以回憶一...

Dubbo原始碼分析

dubbo原始碼分析 其實已經有很多比較好的原始碼分析部落格,結合部落格和開發經驗再去分析原始碼,就能對dubbo的實現有個整體全面的理解,也能深入去深究其中的具體實現細節。dubbo裡主要用到的spi service provider inte ce netty nio 同步非阻塞多路復用框架,d...