在使用dubbo时可以分为客户端和服务端两块。客户端接入dubbo的方法如下:
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
<dubbo:reference id="enterpriseSignatureService" interface="com.mph.coreapi.user.service.EnterpriseSignatureService" timeout="60000" version="1.0" />
@Resource
private EnterpriseSignatureService enterpriseSignatureService;
上面是核心代码节选出来。
- 1.导入dubbo的命名空间
- 2.使用dubbo命名空间设置一个bean
- 3.使用spring注入这个Bean
对于spring源码比较熟悉的同学肯定知道既然dubbo将bean的实例化交给了spring那么new的过程肯定是交给spring来完成。一般来说spring实例化Bean的方式有三种方式: - 1.如果是有接口继承那么通过JDK提供的反射机制就可以进行实例化:class反射调用newInstance方法
- 2.没有接口的情况,使用CGLIB进行字节码重组
- 3.自己实现FactoryBean接口(具体原理可以参考我的博客spring源码分析-FactoryBean使用和原理)
很明显dubbo肯定是用的第三种方式。全文搜索一下FactoryBean可以找到ReferenceBean
是继承FactoryBean
public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean {
可以找到getObject方法,下面是调用流程。(节约一点篇幅放到一起)
@Override
public Object getObject() throws Exception {
return get();
}
public synchronized T get() {
if (destroyed) {
throw new IllegalStateException("Already destroyed!");
}
if (ref == null) {
init();
}
return ref;
}
private void init() {
//省略部分代码...
ref = createProxy(map);
ConsumerModel consumerModel = new ConsumerModel(getUniqueServiceName(), this, ref, interfaceClass.getMethods());
ApplicationModel.initConsumerModel(getUniqueServiceName(), consumerModel);
}
private T createProxy(Map<String, String> map) {
//省略部分代码...
if (logger.isInfoEnabled()) {
logger.info("Refer dubbo service " + interfaceClass.getName() + " from url " + invoker.getUrl());
}
// create service proxy
return (T) proxyFactory.getProxy(invoker);
}
从上面可以看出dubbo客户端和spring结合原理。中间创建的过程我都省略了,后面再写一篇更为详细的实现逻辑
网友评论