1. 程式人生 > >Dubbo的Extension原始碼分析

Dubbo的Extension原始碼分析

我們基於ExtensionLoader.getExtensionLoader().getAdaptiveExtension()這個入口進行了原始碼分析,已經通過上一節課進行了分析。我也做了很詳細的筆記給大家去做鞏固,希望大家有去學習

簡單整理一下上節課getAdaptiveExtension的流程圖

injectExtension

  • 這裡可以看到,擴充套件點自動注入的一句就是根據setter方法對應的引數型別和property名稱從ExtensionFactory中查詢,如果有返回擴充套件點例項,那麼就進行注入操作。
  • 到這裡getAdaptiveExtension方法就分析完畢了。

還記得我們在講解@Adaptive的時候提到過的AdaptiveCompiler類嗎?這個類裡面有一個setDefaultCompiler方法,他本身沒有實現compile。而是基於DEFAULT_COMPILER。然後載入指定擴充套件點進行動態呼叫。那麼這個DEFAULT_COMPILER這個值,就是在injectExtension方法中進行注入的。簡單看看

關於objectFactory

在injectExtension這個方法中,我們發現入口出的程式碼首先判斷了objectFactory這個物件是否為空。這個是在哪裡初始化的呢?實際上我們在獲得ExtensionLoader的時候,就對objectFactory進行了初始化。

然後通過ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()去獲得一個自適應的擴充套件點,進入ExtensionFactory這個介面中,可以看到它是一個擴充套件點,並且有一個自己實現的自適應擴充套件點AdaptiveExtensionFactory;

  • 注意:@Adaptive載入到類上表示這是一個自定義的介面卡類,表示我們再呼叫getAdaptiveExtension方法的時候,不需要走上面這麼複雜的過程。
  • 會直接載入到AdaptiveExtensionFactory。(此處程式碼在loadFile 640行),然後在getAdaptiveExtensionClass()方法處有判斷

  • 我們可以看到除了自定義的自適應介面卡類以外,還有兩個實現類,一個是SPI,一個是Spring,AdaptiveExtensionFactory

我們可以看到除了自定義的自適應介面卡類以外,還有兩個實現類,一個是SPI,一個是Spring,AdaptiveExtensionFactory

AdaptiveExtensionFactory輪詢這2個,從一箇中獲取到就返回。