dubbo系列<12>--dubbo中的IOC

在前面dubbo源碼翻閱中已經提過一些相關的IOC的。大體爲如下幾點:spring

  1. 在講解ExtensionLoader源碼的構造函數的時候,咱們說過,每個ExtensionLoader實例都有一個 objectFactory 屬性,他是實現Ioc的關鍵;緩存

  2.  相比較於JDK的SPI機制,dubbo的SPI機制支持擴展經過setter的方式來注入其餘擴展點。app

  3. 在調用ExtensionLoader的getExtension方法時,在獲取了相應的class並建立了instance以後,經過injectExtension(intance)方法來經過setter的方式來注入其餘擴展點。ide

  4. loadFile函數解析註解@SPI配置時,假如這個類帶@Adaptive註解,緩存到cachedAdaptiveClass。函數

再看源碼:建立一個ExtensionLoader對象spa


這裏的調用的是一個私有構造方法。orm


由於此時type是Protocol.class,即對象

objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension();遞歸

當type爲ExtensionFactory.class時,即 objectFactory = null.咱們能夠看出,全部非ExtensionFactory.class擴展點接口都會執行ExtensionFactory對應的ExtensionLoader實例的getAdaptiveExtension()方法返回一個ExtensionFactory實例,即objectFactory對象。不然,objectFactory對象爲null。(循環遞歸調用)接口

ExtensionFactory的實現類AdaptiveExtensionFactory帶有Adaptive標籤,另外兩個實現類SpiExtensionFactory、SpringExtensionFactory就是正常的實現類,也是咱們見的最多的那種擴展點實現類。

關鍵說明,

  1. factories屬性,全部的非@Adaptive類的ExtensionFactory實例的集合,之後全部與ExtensionFactory打交道的操做都交給AdaptiveExtensionFactory

  2. injectExtension方法中,調用的 Object object = objectFactory.

    getExtension(pt, property);分別調用SpiExtensionFactory、SpringExtensionFactory兩個實際的實現類。

如下是三個類的源碼,只有AdaptiveExtensionFactory存在@Adaptive註解

查看SpringExtensionFactory,很容易發現


這個類的ApplicationContext就是spring中,


由於獲取到了ApplicationContext,就能夠調用getBean方法來得到Spring的bean對象了。

public class SpringContextUtil implements ApplicationContextAware {     // Spring應用上下文環境     private static ApplicationContext applicationContext;     /**      * 實現ApplicationContextAware接口的回調方法,設置上下文環境      *       * @param applicationContext      */     public void setApplicationContext(ApplicationContext applicationContext) {         SpringContextUtil.applicationContext = applicationContext;     }     /**      * @return ApplicationContext      */     public static ApplicationContext getApplicationContext() {         return applicationContext;     }     /**      * 獲取對象      *       * @param name      * @return Object     * @throws BeansException      */     public static Object getBean(String name) throws BeansException {         return applicationContext.getBean(name);     }  }

OK,dubbo的IOC就這樣咯,後面咱們再來看看dubbo中AOP是怎麼玩的

相關文章
相關標籤/搜索