dubbo系列--dubbo中是如何實現IOC的
在前面dubbo原始碼翻閱中已經提過一些相關的IOC的。大致為以下幾點:
-
在講解ExtensionLoader原始碼的建構函式的時候,我們說過,每一個ExtensionLoader例項都有一個 objectFactory 屬性,他是實現Ioc的關鍵;
-
相比較於JDK的SPI機制,dubbo的SPI機制支援擴充套件通過setter的方式來注入其他擴充套件點。
-
在呼叫ExtensionLoader的getExtension方法時,在獲取了相應的class並建立了instance之後,通過injectExtension(intance)方法來通過setter的方式來注入其他擴充套件點。
-
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就是正常的實現類,也是我們見的最多的那種擴充套件點實現類。
關鍵說明,
-
factories屬性,所有的非@Adaptive類的ExtensionFactory例項的集合,以後所有與ExtensionFactory打交道的操作都交給AdaptiveExtensionFactory
-
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後端技術站