一、服务引用
1、初始的时候,是在spring容器初始化的时候,即要生成引用的代理类。
ReferenceBean implements InitializingBean
--ReferenceBean.afterPropertiesSet()
--ReferenceBean.getObject()
--ReferenceConfig.get()
--ReferenceConfig.init()
2、生成目标类的代理类,用于远程调用
ReferenceConfig.init()
--
--
--ReferenceConfig.createProxy()
--
final boolean isJvmRefer;
if (isInjvm() == null) {
if (url != null && url.length() > 0) {
isJvmRefer = false;
} else if (InjvmProtocol.getInjvmProtocol().isInjvmRefer(tmpUrl)) {
isJvmRefer = true;
} else {
isJvmRefer = false;
}
} else {
isJvmRefer = isInjvm().booleanValue();
}
--
URL url = new URL(Constants.LOCAL_PROTOCOL, NetUtils.LOCALHOST, 0, interfaceClass.getName()).addParameters(map);
invoker = refprotocol.refer(interfaceClass, url);
--
String[] us = Constants.SEMICOLON_SPLIT_PATTERN.split(url);
if (us != null && us.length > 0) {
for (String u : us) {
URL url = URL.valueOf(u);
if (url.getPath() == null || url.getPath().length() == 0) {
url = url.setPath(interfaceName);
}
if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
urls.add(url.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
} else {
urls.add(ClusterUtils.mergeUrl(url, map));
}
}
}
--
List<URL> us = loadRegistries(false);
if (us != null && !us.isEmpty()) {
for (URL u : us) {
URL monitorUrl = loadMonitor(u);
if (monitorUrl != null) {
map.put(Constants.MONITOR_KEY, URL.encode(monitorUrl.toFullString()));
}
urls.add(u.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
}
}
--
if (urls.size() == 1) {
invoker = refprotocol.refer(interfaceClass, urls.get(0));
--DubboInvoker.refer()
--DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);
} else {
List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();
URL registryURL = null;
for (URL url : urls) {
invokers.add(refprotocol.refer(interfaceClass, url));
--
--RegistryProtocol.doRefer()
--Invoker invoker = cluster.join(directory);
ProviderConsumerRegTable.registerConsumer(invoker, url, subscribeUrl, directory);
return invoker;
if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
registryURL = url;
}
}
if (registryURL != null) {
URL u = registryURL.addParameter(Constants.CLUSTER_KEY, AvailableCluster.NAME);
invoker = cluster.join(new StaticDirectory(u, invokers));
} else {
invoker = cluster.join(new StaticDirectory(invokers));
}
}
--
proxyFactory.getProxy(invoker);
--StubProxyFactoryWrapper.getProxy();
--AbstractProxyFactory.getProxy();
-- interfaces[0] = invoker.getInterface();
interfaces[1] = EchoService.class;
--JavassistProxyFactory.getProxy(invoker,interfaces);
3.生成的代理类
public class proxy0
implements ClassGenerator.DC,
EchoService,
DemoService {
public static Method[] methods;
private InvocationHandler handler;
@Override
public String sayHello(String string) {
Object[] arrobject = new Object[]{string};
Object object = null;
try {
object = this.handler.invoke(this, methods[0], arrobject);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return (String) object;
}
@Override
public Object $echo(Object object) {
Object[] arrobject = new Object[]{object};
Object object2 = null;
try {
object2 = this.handler.invoke(this, methods[1], arrobject);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return object2;
}
public proxy0() {
}
public proxy0(InvocationHandler invocationHandler) {
this.handler = invocationHandler;
}
}