@SPI
public interface ExtensionFactory {
<T> T getExtension(Class<T> type, String name);
}
ExtensionFactory 是根工厂类,是后续获取各个Extension的基础,是其他Extension的
ObjectFactory
在ExtensionLoader 中有个私有构造函数
private ExtensionLoader(Class<?> type) {
this.type = type;
objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
}
当type为
ExtensionFactory 时,
ExtensionFactory 的ExtensionLoader.objectFactory为空,即
new ExtensionLoader(){
type = com.alibaba.dubbo.common.extension.ExtensionFactory;
objectFactory = null;
}
而在
ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension();获取适配类时有两个原则,如果spi扩展点获取到的类中有 @Adaptive注解标注的类,则设置为该type类型的
Adaptive类,如果没有获取到,则动态创建Adaptive代理类。
由于META-INF/dubbo/internal/com.alibaba.dubbo.common.extension.ExtensionFactory
文件下定义了如下类
adaptive=com.alibaba.dubbo.common.extension.factory.AdaptiveExtensionFactory --> Adaptive类
spi=com.alibaba.dubbo.common.extension.factory.SpiExtensionFactory
spring=com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
由ExtensionLoader.loadFile 中有这么一段,因此
ExtensionFactory 的Adaptive类为
AdaptiveExtensionFactory
初始化
AdaptiveExtensionFactory 时
可知除了Class = ExtensionFactory.class 的objectFactory为空 外,其他type 类型的objectFactory均为 包含有
factorys=[SpiExtensionFactory,SpringExtensionFactory] 的
AdaptiveExtensionFactory