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

在使用dubbo时可以分为客户端和服务端两块。客户端接入dubbo的方法如下:

http://code.alibabatech.com/schema/dubbo/dubbo.xsd



@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 extends ReferenceConfig 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 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结合点分析)