dubbo的Extension源碼分析

咱們基於ExtensionLoader.getExtensionLoader().getAdaptiveExtension()這個入口進行了源碼分析,已經經過上一節課進行了分析。我也作了很詳細的筆記給你們去作鞏固,但願你們有去學習源碼分析

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

injectExtensionspa

  • 這裏能夠看到,擴展點自動注入的一句就是根據setter方法對應的參數類型和property名稱從ExtensionFactory中查詢,若是有返回擴展點實例,那麼就進行注入操做。
  • 到這裏getAdaptiveExtension方法就分析完畢了。

還記得咱們在講解@Adaptive的時候提到過的AdaptiveCompiler類嗎?這個類裏面有一個setDefaultCompiler方法,他自己沒有實現compile。而是基於DEFAULT_COMPILER。而後加載指定擴展點進行動態調用。那麼這個DEFAULT_COMPILER這個值,就是在injectExtension方法中進行注入的。簡單看看對象

關於objectFactory

在injectExtension這個方法中,咱們發現入口出的代碼首先判斷了objectFactory這個對象是否爲空。這個是在哪裏初始化的呢?實際上咱們在得到ExtensionLoader的時候,就對objectFactory進行了初始化。blog

而後經過ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()去得到一個自適應的擴展點,進入ExtensionFactory這個接口中,能夠看到它是一個擴展點,而且有一個本身實現的自適應擴展點AdaptiveExtensionFactory;接口

  • 注意:@Adaptive加載到類上表示這是一個自定義的適配器類,表示咱們再調用getAdaptiveExtension方法的時候,不須要走上面這麼複雜的過程。
  • 會直接加載到AdaptiveExtensionFactory。(此處代碼在loadFile 640行),而後在getAdaptiveExtensionClass()方法處有判斷

  • 咱們能夠看到除了自定義的自適應適配器類之外,還有兩個實現類,一個是SPI,一個是Spring,AdaptiveExtensionFactory

咱們能夠看到除了自定義的自適應適配器類之外,還有兩個實現類,一個是SPI,一個是Spring,AdaptiveExtensionFactoryget

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

相關文章
相關標籤/搜索