0
点赞
收藏
分享

微信扫一扫

dubbo系列<12>--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对象

dubbo系列<12>--dubbo中的IOC_构造函数

这里的调用的是一个私有构造方法。

dubbo系列<12>--dubbo中的IOC_构造函数_02

因为此时type是Protocol.class,即

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

当type为ExtensionFactory.class时,即 objectFactory = null.我们可以看出,所有非ExtensionFactory.class扩展点接口都会执行ExtensionFactory对应的ExtensionLoader实例的getAdaptiveExtension()方法返回一个ExtensionFactory实例,即objectFactory对象。否则,objectFactory对象为null。(循环递归调用)

dubbo系列<12>--dubbo中的IOC_回调方法_03

dubbo系列<12>--dubbo中的IOC_回调方法_04

ExtensionFactory的实现类AdaptiveExtensionFactory带有Adaptive标签,另外两个实现类SpiExtensionFactory、SpringExtensionFactory就是正常的实现类,也是我们见的最多的那种扩展点实现类。

关键说明,

  1. factories属性,所有的非@Adaptive类的ExtensionFactory实例的集合,以后所有与ExtensionFactory打交道的操作都交给AdaptiveExtensionFactory
  2. injectExtension方法中,调用的 Object object = objectFactory.
    getExtension(pt, property);分别调用SpiExtensionFactory、SpringExtensionFactory两个实际的实现类。

以下是三个类的源码,只有AdaptiveExtensionFactory存在@Adaptive注解

dubbo系列<12>--dubbo中的IOC_构造函数_05

dubbo系列<12>--dubbo中的IOC_回调方法_06

dubbo系列<12>--dubbo中的IOC_回调方法_07

查看SpringExtensionFactory,很容易发现

dubbo系列<12>--dubbo中的IOC_回调方法_08

这个类的ApplicationContext就是spring中,

dubbo系列<12>--dubbo中的IOC_回调方法_09

因为获取到了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是怎么玩的

举报

相关推荐

0 条评论