在前面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是怎么玩的