美文网首页
03-dubbo客户端与spring结合点分析

03-dubbo客户端与spring结合点分析

作者: cjxz | 来源:发表于2019-01-24 15:14 被阅读0次

    在使用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结合原理。中间创建的过程我都省略了,后面再写一篇更为详细的实现逻辑

    相关文章

      网友评论

          本文标题:03-dubbo客户端与spring结合点分析

          本文链接:https://www.haomeiwen.com/subject/puayjqtx.html