com.alibaba.dubbo.common.extension.ExtensionLoader<T> 这个类是dubbo 实现SPI关键
dubbo中 refer()方法时 Protocol中动态类
Protocol$Adaptive
1 package com.alibaba.dubbo.rpc; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class Protocol$Adaptive implements com.alibaba.dubbo.rpc.Protocol { 7 public void destroy() { 8 throw new UnsupportedOperationException( 9 "method public abstract void com.alibaba.dubbo.rpc.Protocol.destroy() of interface com.alibaba.dubbo.rpc.Protocol 10 is not adaptive method!"); 11 } 12 13 public int getDefaultPort() { 14 throw new UnsupportedOperationException( 15 "method public abstract int com.alibaba.dubbo.rpc.Protocol.getDefaultPort() of interface com.alibaba.dubbo.rpc.Protocol 16 is not adaptive method!"); 17 } 18 19 public com.alibaba.dubbo.rpc.Exporter export( 20 com.alibaba.dubbo.rpc.Invoker arg0) 21 throws com.alibaba.dubbo.rpc.RpcException { 22 if (arg0 == null) { 23 throw new IllegalArgumentException( 24 "com.alibaba.dubbo.rpc.Invoker argument == null"); 25 } 26 27 if (arg0.getUrl() == null) { 28 throw new IllegalArgumentException( 29 "com.alibaba.dubbo.rpc.Invoker argument getUrl() == null"); 30 } 31 32 com.alibaba.dubbo.common.URL url = arg0.getUrl(); 33 String extName = ((url.getProtocol() == null) ? "dubbo" 34 : url.getProtocol()); 35 36 if (extName == null) { 37 throw new IllegalStateException( 38 "Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(" + 39 url.toString() + ") use keys([protocol])"); 40 } 41 42 com.alibaba.dubbo.rpc.Protocol extension = 43 (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class) 44 .getExtension(extName); 45 46 return extension.export(arg0); 47 } 48 49 public com.alibaba.dubbo.rpc.Invoker refer(java.lang.Class arg0, 50 com.alibaba.dubbo.common.URL arg1) 51 throws com.alibaba.dubbo.rpc.RpcException { 52 if (arg1 == null) { 53 throw new IllegalArgumentException("url == null"); 54 } 55 56 com.alibaba.dubbo.common.URL url = arg1; 57 String extName = ((url.getProtocol() == null) ? "dubbo" 58 : url.getProtocol()); 59 60 if (extName == null) { 61 throw new IllegalStateException( 62 "Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(" + 63 url.toString() + ") use keys([protocol])"); 64 } 65 66 com.alibaba.dubbo.rpc.Protocol extension = 67 (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class) 68 .getExtension(extName); 69 70 return extension.refer(arg0, arg1); 71 } 72 } 73
ProxyFactory$Adaptive
1 package com.alibaba.dubbo.rpc; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class ProxyFactory$Adaptive implements com.alibaba.dubbo.rpc.ProxyFactory { 7 public com.alibaba.dubbo.rpc.Invoker getInvoker(java.lang.Object arg0, 8 java.lang.Class arg1, com.alibaba.dubbo.common.URL arg2) 9 throws com.alibaba.dubbo.rpc.RpcException { 10 if (arg2 == null) { 11 throw new IllegalArgumentException("url == null"); 12 } 13 14 com.alibaba.dubbo.common.URL url = arg2; 15 String extName = url.getParameter("proxy", "javassist"); 16 17 if (extName == null) { 18 throw new IllegalStateException( 19 "Fail to get extension(com.alibaba.dubbo.rpc.ProxyFactory) name from url(" + 20 url.toString() + ") use keys([proxy])"); 21 } 22 23 com.alibaba.dubbo.rpc.ProxyFactory extension = (com.alibaba.dubbo.rpc.ProxyFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.ProxyFactory.class) 24 .getExtension(extName); 25 26 return extension.getInvoker(arg0, arg1, arg2); 27 } 28 29 public java.lang.Object getProxy(com.alibaba.dubbo.rpc.Invoker arg0) 30 throws com.alibaba.dubbo.rpc.RpcException { 31 if (arg0 == null) { 32 throw new IllegalArgumentException( 33 "com.alibaba.dubbo.rpc.Invoker argument == null"); 34 } 35 36 if (arg0.getUrl() == null) { 37 throw new IllegalArgumentException( 38 "com.alibaba.dubbo.rpc.Invoker argument getUrl() == null"); 39 } 40 41 com.alibaba.dubbo.common.URL url = arg0.getUrl(); 42 String extName = url.getParameter("proxy", "javassist"); 43 44 if (extName == null) { 45 throw new IllegalStateException( 46 "Fail to get extension(com.alibaba.dubbo.rpc.ProxyFactory) name from url(" + 47 url.toString() + ") use keys([proxy])"); 48 } 49 50 com.alibaba.dubbo.rpc.ProxyFactory extension = (com.alibaba.dubbo.rpc.ProxyFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.ProxyFactory.class) 51 .getExtension(extName); 52 53 return extension.getProxy(arg0); 54 } 55 }
Cluster$Adaptive
1 package com.alibaba.dubbo.rpc.cluster; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class Cluster$Adaptive implements com.alibaba.dubbo.rpc.cluster.Cluster { 7 public com.alibaba.dubbo.rpc.Invoker join( 8 com.alibaba.dubbo.rpc.cluster.Directory arg0) 9 throws com.alibaba.dubbo.rpc.RpcException { 10 if (arg0 == null) { 11 throw new IllegalArgumentException( 12 "com.alibaba.dubbo.rpc.cluster.Directory argument == null"); 13 } 14 15 if (arg0.getUrl() == null) { 16 throw new IllegalArgumentException( 17 "com.alibaba.dubbo.rpc.cluster.Directory argument getUrl() == null"); 18 } 19 20 com.alibaba.dubbo.common.URL url = arg0.getUrl(); 21 String extName = url.getParameter("cluster", "failover"); 22 23 if (extName == null) { 24 throw new IllegalStateException( 25 "Fail to get extension(com.alibaba.dubbo.rpc.cluster.Cluster) name from url(" + 26 url.toString() + ") use keys([cluster])"); 27 } 28 29 com.alibaba.dubbo.rpc.cluster.Cluster extension = (com.alibaba.dubbo.rpc.cluster.Cluster) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.cluster.Cluster.class).getExtension(extName); 30 31 return extension.join(arg0); 32 } 33 }
CacheFactory$Adaptive
1 package com.alibaba.dubbo.cache; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class CacheFactory$Adaptive implements com.alibaba.dubbo.cache.CacheFactory { 7 public com.alibaba.dubbo.cache.Cache getCache( 8 com.alibaba.dubbo.common.URL arg0, com.alibaba.dubbo.rpc.Invocation arg1) { 9 if (arg0 == null) { 10 throw new IllegalArgumentException("url == null"); 11 } 12 13 com.alibaba.dubbo.common.URL url = arg0; 14 15 if (arg1 == null) { 16 throw new IllegalArgumentException("invocation == null"); 17 } 18 19 String methodName = arg1.getMethodName(); 20 String extName = url.getMethodParameter(methodName, "cache", "lru"); 21 22 if (extName == null) { 23 throw new IllegalStateException( 24 "Fail to get extension(com.alibaba.dubbo.cache.CacheFactory) name from url(" + 25 url.toString() + ") use keys([cache])"); 26 } 27 28 com.alibaba.dubbo.cache.CacheFactory extension = (com.alibaba.dubbo.cache.CacheFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.cache.CacheFactory.class) 29 .getExtension(extName); 30 31 return extension.getCache(arg0, arg1); 32 } 33 }
MonitorFactory$Adaptive
1 package com.alibaba.dubbo.monitor; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class MonitorFactory$Adaptive implements com.alibaba.dubbo.monitor.MonitorFactory { 7 public com.alibaba.dubbo.monitor.Monitor getMonitor( 8 com.alibaba.dubbo.common.URL arg0) { 9 if (arg0 == null) { 10 throw new IllegalArgumentException("url == null"); 11 } 12 13 com.alibaba.dubbo.common.URL url = arg0; 14 String extName = ((url.getProtocol() == null) ? "dubbo" 15 : url.getProtocol()); 16 17 if (extName == null) { 18 throw new IllegalStateException( 19 "Fail to get extension(com.alibaba.dubbo.monitor.MonitorFactory) name from url(" + 20 url.toString() + ") use keys([protocol])"); 21 } 22 23 com.alibaba.dubbo.monitor.MonitorFactory extension = (com.alibaba.dubbo.monitor.MonitorFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.monitor.MonitorFactory.class) 24 .getExtension(extName); 25 26 return extension.getMonitor(arg0); 27 } 28 }
Validation$Adaptive
1 package com.alibaba.dubbo.validation; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class Validation$Adaptive implements com.alibaba.dubbo.validation.Validation { 7 public com.alibaba.dubbo.validation.Validator getValidator( 8 com.alibaba.dubbo.common.URL arg0) { 9 if (arg0 == null) { 10 throw new IllegalArgumentException("url == null"); 11 } 12 13 com.alibaba.dubbo.common.URL url = arg0; 14 String extName = url.getParameter("validation", "jvalidation"); 15 16 if (extName == null) { 17 throw new IllegalStateException( 18 "Fail to get extension(com.alibaba.dubbo.validation.Validation) name from url(" + 19 url.toString() + ") use keys([validation])"); 20 } 21 22 com.alibaba.dubbo.validation.Validation extension = (com.alibaba.dubbo.validation.Validation) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.validation.Validation.class) 23 .getExtension(extName); 24 25 return extension.getValidator(arg0); 26 } 27 }
RegistryFactory$Adaptive
1 package com.alibaba.dubbo.registry; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class RegistryFactory$Adaptive implements com.alibaba.dubbo.registry.RegistryFactory { 7 public com.alibaba.dubbo.registry.Registry getRegistry( 8 com.alibaba.dubbo.common.URL arg0) { 9 if (arg0 == null) { 10 throw new IllegalArgumentException("url == null"); 11 } 12 13 com.alibaba.dubbo.common.URL url = arg0; 14 String extName = ((url.getProtocol() == null) ? "dubbo" 15 : url.getProtocol()); 16 17 if (extName == null) { 18 throw new IllegalStateException( 19 "Fail to get extension(com.alibaba.dubbo.registry.RegistryFactory) name from url(" + 20 url.toString() + ") use keys([protocol])"); 21 } 22 23 com.alibaba.dubbo.registry.RegistryFactory extension = (com.alibaba.dubbo.registry.RegistryFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.registry.RegistryFactory.class) 24 .getExtension(extName); 25 26 return extension.getRegistry(arg0); 27 } 28 }
Transporter$Adaptive
1 package com.alibaba.dubbo.remoting; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class Transporter$Adaptive implements com.alibaba.dubbo.remoting.Transporter { 7 public com.alibaba.dubbo.remoting.Client connect( 8 com.alibaba.dubbo.common.URL arg0, 9 com.alibaba.dubbo.remoting.ChannelHandler arg1) 10 throws com.alibaba.dubbo.remoting.RemotingException { 11 if (arg0 == null) { 12 throw new IllegalArgumentException("url == null"); 13 } 14 15 com.alibaba.dubbo.common.URL url = arg0; 16 String extName = url.getParameter("client", 17 url.getParameter("transporter", "netty")); 18 19 if (extName == null) { 20 throw new IllegalStateException( 21 "Fail to get extension(com.alibaba.dubbo.remoting.Transporter) name from url(" + 22 url.toString() + ") use keys([client, transporter])"); 23 } 24 25 com.alibaba.dubbo.remoting.Transporter extension = (com.alibaba.dubbo.remoting.Transporter) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.remoting.Transporter.class) 26 .getExtension(extName); 27 28 return extension.connect(arg0, arg1); 29 } 30 31 public com.alibaba.dubbo.remoting.Server bind( 32 com.alibaba.dubbo.common.URL arg0, 33 com.alibaba.dubbo.remoting.ChannelHandler arg1) 34 throws com.alibaba.dubbo.remoting.RemotingException { 35 if (arg0 == null) { 36 throw new IllegalArgumentException("url == null"); 37 } 38 39 com.alibaba.dubbo.common.URL url = arg0; 40 String extName = url.getParameter("server", 41 url.getParameter("transporter", "netty")); 42 43 if (extName == null) { 44 throw new IllegalStateException( 45 "Fail to get extension(com.alibaba.dubbo.remoting.Transporter) name from url(" + 46 url.toString() + ") use keys([server, transporter])"); 47 } 48 49 com.alibaba.dubbo.remoting.Transporter extension = (com.alibaba.dubbo.remoting.Transporter) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.remoting.Transporter.class) 50 .getExtension(extName); 51 52 return extension.bind(arg0, arg1); 53 } 54 }
Dispatcher$Adaptive
1 package com.alibaba.dubbo.remoting; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class Dispatcher$Adaptive implements com.alibaba.dubbo.remoting.Dispatcher { 7 public com.alibaba.dubbo.remoting.ChannelHandler dispatch( 8 com.alibaba.dubbo.remoting.ChannelHandler arg0, 9 com.alibaba.dubbo.common.URL arg1) { 10 if (arg1 == null) { 11 throw new IllegalArgumentException("url == null"); 12 } 13 14 com.alibaba.dubbo.common.URL url = arg1; 15 String extName = url.getParameter("dispatcher", 16 url.getParameter("dispather", 17 url.getParameter("channel.handler", "all"))); 18 19 if (extName == null) { 20 throw new IllegalStateException( 21 "Fail to get extension(com.alibaba.dubbo.remoting.Dispatcher) name from url(" + 22 url.toString() + 23 ") use keys([dispatcher, dispather, channel.handler])"); 24 } 25 26 com.alibaba.dubbo.remoting.Dispatcher extension = (com.alibaba.dubbo.remoting.Dispatcher) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.remoting.Dispatcher.class) 27 .getExtension(extName); 28 29 return extension.dispatch(arg0, arg1); 30 } 31 }
ThreadPool$Adaptive
1 package com.alibaba.dubbo.common.threadpool; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class ThreadPool$Adaptive implements com.alibaba.dubbo.common.threadpool.ThreadPool { 7 public java.util.concurrent.Executor getExecutor( 8 com.alibaba.dubbo.common.URL arg0) { 9 if (arg0 == null) { 10 throw new IllegalArgumentException("url == null"); 11 } 12 13 com.alibaba.dubbo.common.URL url = arg0; 14 String extName = url.getParameter("threadpool", "fixed"); 15 16 if (extName == null) { 17 throw new IllegalStateException( 18 "Fail to get extension(com.alibaba.dubbo.common.threadpool.ThreadPool) name from url(" + 19 url.toString() + ") use keys([threadpool])"); 20 } 21 22 com.alibaba.dubbo.common.threadpool.ThreadPool extension = (com.alibaba.dubbo.common.threadpool.ThreadPool) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.common.threadpool.ThreadPool.class) 23 .getExtension(extName); 24 25 return extension.getExecutor(arg0); 26 } 27 }
RouterFactory$Adaptive
1 package com.alibaba.dubbo.rpc.cluster; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class RouterFactory$Adaptive implements com.alibaba.dubbo.rpc.cluster.RouterFactory { 7 public com.alibaba.dubbo.rpc.cluster.Router getRouter( 8 com.alibaba.dubbo.common.URL arg0) { 9 if (arg0 == null) { 10 throw new IllegalArgumentException("url == null"); 11 } 12 13 com.alibaba.dubbo.common.URL url = arg0; 14 String extName = url.getProtocol(); 15 16 if (extName == null) { 17 throw new IllegalStateException( 18 "Fail to get extension(com.alibaba.dubbo.rpc.cluster.RouterFactory) name from url(" + 19 url.toString() + ") use keys([protocol])"); 20 } 21 22 com.alibaba.dubbo.rpc.cluster.RouterFactory extension = (com.alibaba.dubbo.rpc.cluster.RouterFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.cluster.RouterFactory.class) 23 .getExtension(extName); 24 25 return extension.getRouter(arg0); 26 } 27 }
ConfiguratorFactory$Adaptive
1 package com.alibaba.dubbo.rpc.cluster; 2 3 import com.alibaba.dubbo.common.extension.ExtensionLoader; 4 5 6 public class ConfiguratorFactory$Adaptive implements com.alibaba.dubbo.rpc.cluster.ConfiguratorFactory { 7 public com.alibaba.dubbo.rpc.cluster.Configurator getConfigurator( 8 com.alibaba.dubbo.common.URL arg0) { 9 if (arg0 == null) { 10 throw new IllegalArgumentException("url == null"); 11 } 12 13 com.alibaba.dubbo.common.URL url = arg0; 14 String extName = url.getProtocol(); 15 16 if (extName == null) { 17 throw new IllegalStateException( 18 "Fail to get extension(com.alibaba.dubbo.rpc.cluster.ConfiguratorFactory) name from url(" + 19 url.toString() + ") use keys([protocol])"); 20 } 21 22 com.alibaba.dubbo.rpc.cluster.ConfiguratorFactory extension = (com.alibaba.dubbo.rpc.cluster.ConfiguratorFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.cluster.ConfiguratorFactory.class) 23 .getExtension(extName); 24 25 return extension.getConfigurator(arg0); 26 } 27 }
getExtension(extName)方法中最终调用createExtension(String name)
根据name创建相应的实例,其中
1, injectExtension() 会注入属性(如有setter方法,并且入参只有一个)
2, cachedWrapperClass 会包装实例
WrapperClass
com.alibaba.dubbo.common.extension.ExtensionLoader.createExtension(String)
501行 instance已经从RegistryFactory替换成 com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper, class com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper