1. 程式人生 > >dubbo系列--dubbo中是如何實現IOC的

dubbo系列--dubbo中是如何實現IOC的

在前面dubbo原始碼翻閱中已經提過一些相關的IOC的。大致為以下幾點:

  1. 在講解ExtensionLoader原始碼的建構函式的時候,我們說過,每一個ExtensionLoader例項都有一個 objectFactory 屬性,他是實現Ioc的關鍵;

  2.  相比較於JDK的SPI機制,dubbo的SPI機制支援擴充套件通過setter的方式來注入其他擴充套件點。

  3. 在呼叫ExtensionLoader的getExtension方法時,在獲取了相應的class並建立了instance之後,通過injectExtension(intance)方法來通過setter的方式來注入其他擴充套件點。

  4. loadFile函式解析註解@SPI配置時,假如這個類帶@Adaptive註解,快取到cachedAdaptiveClass。

再看原始碼:建立一個ExtensionLoader物件

這裡的呼叫的是一個私有構造方法。

因為此時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是怎麼玩的

更多後端知識請關注微信公眾號Java後端技術站