dubbo SPI机制中getExtensionLoade()方法

137 阅读1分钟

本文讨论dubbo SPI机制中ExtensionLoader.getExtensionLoade(Class type)方法

ExtensionLoader.getExtensionLoade(Classtype)本质就是根据传入的形参,获取一个该类型的ExtensionLoader,然后缓存到EXTENSION_LOADERS,下次直接get。

举个例子:type为com.alibaba.dubbo.container.Container-----> com.alibaba.dubbo.common.extension.ExtensionLoader[com.alibaba.dubbo.container.Container]

涉及的代码如下:

 public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
        //...去掉了if判断逻辑
        
        ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
        if (loader == null) {
            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));//私有构造方法
            loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
        }
        return loader;
    }
     private ExtensionLoader(Class<?> type) {
        this.type = type;//扩展点的接口类型
        objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
    }

ExtensionLoader的构造方法是私有的,涉及到单例模式。 在这个构造方法中,首先会判断type是否是ExtensionFactory,若是,objectFactory=null。否则获取ExtensionFactory的扩展。(getAdaptiveExtension方法下次介绍)

objectFactory这个变量到底是什么呢?

1.在ExtensionLoader是这样定义的 private final ExtensionFactory objectFactory;它是一个ExtensionFactory。

2.通过ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()获取。

3.它就是为dubbo的IOC提供所有对象。