- 上篇文章写了一下spi在java和spiring中的实现,以及Dubbo中的静态扩展点文章链接,这里接着把Dubbo的自适应扩展点和激活扩展点看完
- 这里还是上篇的dubbo测试类
public class DubboSpi {
public static void main(String[] args) {
//静态扩展点
Container myContainer = ExtensionLoader.getExtensionLoader(Container.class).getExtension("myContainer");
System.out.println(myContainer);
//输出:com.test.spi.dubbo.MyContainer@6aa8ceb6
//自适应扩展点,加在类上和加载方法上
Compiler adaptiveExtension = ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension();
System.out.println(adaptiveExtension);
//输出:org.apache.dubbo.common.compiler.support.AdaptiveCompiler@759ebb3d
Protocol adaptiveExtension1 = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
System.out.println(adaptiveExtension1);
//输出:org.apache.dubbo.rpc.Protocol$Adaptive@61a485d2
//激活扩展点
URL url = new URL("","localhost",8080).addParameters(Constants.DEPRECATED_KEY,Constants.DEPRECATED_KEY);
List<Filter> activateExtension = ExtensionLoader.getExtensionLoader(Filter.class)
.getActivateExtension(url, Constants.DEPRECATED_KEY);
System.out.println(activateExtension);
//输出:[org.apache.dubbo.rpc.filter.EchoFilter@69ea3742, org.apache.dubbo.rpc.filter.ClassLoaderFilter@4b952a2d, org.apache.dubbo.rpc.filter.GenericFilter@3159c4b8, org.apache.dubbo.rpc.filter.ConsumerContextFilter@73846619, org.apache.dubbo.rpc.filter.ContextFilter@4bec1f0c, org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter@29ca901e, org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter@5649fd9b, org.apache.dubbo.rpc.filter.TimeoutFilter@6adede5, org.apache.dubbo.monitor.support.MonitorFilter@2d928643, org.apache.dubbo.rpc.filter.ExceptionFilter@5025a98f, org.apache.dubbo.cache.filter.CacheFilter@49993335]
}
}
自适应扩展点
我们可以看到自适应扩展点有2种,一种是@Adaptive加载类上,一种是@Adaptive加载方法上,加载方法上的比较简单,我们从getAdaptiveExtension()开始看起,调用路线如下
- getAdaptiveExtension()
- createAdaptiveExtension()
- getAdaptiveExtensionClass() 之后我们还会回到这里
- getExtensionClasses()
- loadExtensionClasses()
- loadDirectory()
- loadResource()
- loadClass() 这里就是查看@Adaptive加在类上的关键地方了
- loadResource()
- loadDirectory()
- loadExtensionClasses()
- getExtensionClasses()
- getAdaptiveExtensionClass() 之后我们还会回到这里
- createAdaptiveExtension()
private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL resourceURL, Class<?> clazz, String name) throws NoSuchMethodException {