在前面dubbo源碼翻閱中已經提過一些相關的IOC的。大體爲如下幾點:spring
在講解ExtensionLoader源碼的構造函數的時候,咱們說過,每個ExtensionLoader實例都有一個 objectFactory 屬性,他是實現Ioc的關鍵;緩存
相比較於JDK的SPI機制,dubbo的SPI機制支持擴展經過setter的方式來注入其餘擴展點。app
在調用ExtensionLoader的getExtension方法時,在獲取了相應的class並建立了instance以後,經過injectExtension(intance)方法來經過setter的方式來注入其餘擴展點。ide
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就是正常的實現類,也是咱們見的最多的那種擴展點實現類。
關鍵說明,
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是怎麼玩的