本文讨论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提供所有对象。