前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dubbo源码之代理对象

Dubbo源码之代理对象

作者头像
spilledyear
发布2019-12-13 12:39:13
3690
发布2019-12-13 12:39:13
举报
文章被收录于专栏:小白鼠小白鼠

提供端和消费端都需要生成代理对象,默认通过 JavassistProxyFactory

提供端

在项目启动暴露服务的时候完成代理对象的创建工作,调用顺序

代码语言:javascript
复制
ServiceBean#afterPropertiesSet => 
ServiceConfig#export => 
ServiceConfig#doExport => 
ServiceConfig#doExportUrlsFor1Protocol
  1. 创建代理对象Wrapper
  2. 创建AbstractProxyInvoker对象,在AbstractProxyInvoker#doInvoke方法中调用Wrapper#invokeMethod
  3. Invoker对象为入参创建Exporter对象
代码语言:javascript
复制
package org.apache.dubbo.common.bytecode;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import org.apache.dubbo.common.bytecode.ClassGenerator.DC;
import org.apache.dubbo.demo.provider.DemoServiceImpl;

public class Wrapper1 extends Wrapper implements DC {
    public static String[] pns;
    public static Map pts;
    public static String[] mns;
    public static String[] dmns;
    public static Class[] mts0;

    public String[] getPropertyNames() {
        return pns;
    }

    public boolean hasProperty(String var1) {
        return pts.containsKey(var1);
    }

    public Class getPropertyType(String var1) {
        return (Class)pts.get(var1);
    }

    public String[] getMethodNames() {
        return mns;
    }

    public String[] getDeclaredMethodNames() {
        return dmns;
    }

    public void setPropertyValue(Object var1, String var2, Object var3) {
        try {
            DemoServiceImpl var4 = (DemoServiceImpl)var1;
        } catch (Throwable var6) {
            throw new IllegalArgumentException(var6);
        }
        throw new NoSuchPropertyException("Not found property \"" + var2 + "\" field or setter method in class org.apache.dubbo.demo.provider.DemoServiceImpl.");
    }

    public Object getPropertyValue(Object var1, String var2) {
        try {
            DemoServiceImpl var3 = (DemoServiceImpl)var1;
        } catch (Throwable var5) {
            throw new IllegalArgumentException(var5);
        }
        throw new NoSuchPropertyException("Not found property \"" + var2 + "\" field or setter method in class org.apache.dubbo.demo.provider.DemoServiceImpl.");
    }

    public Object invokeMethod(Object var1, String var2, Class[] var3, Object[] var4) throws InvocationTargetException {
        DemoServiceImpl var5;
        try {
            var5 = (DemoServiceImpl)var1;
        } catch (Throwable var8) {
            throw new IllegalArgumentException(var8);
        }
        try {
            if ("sayHello".equals(var2) && var3.length == 1) {
                return var5.sayHello((String)var4[0]);
            }
        } catch (Throwable var9) {
            throw new InvocationTargetException(var9);
        }
        throw new NoSuchMethodException("Not found method \"" + var2 + "\" in class org.apache.dubbo.demo.provider.DemoServiceImpl.");
    }
    
    public Wrapper1() {
    }
}

消费端

在项目启动创建引用Bean的时候完成代理对象的创建工作,引用Bean即所谓的代理对象,调用顺序

代码语言:javascript
复制
ReferenceBean#afterPropertiesSet => 
ReferenceBean#getObject => 
ReferenceConfig#init => 
ReferenceConfig#createProxy
  1. 创建Invoker对象,此过程完成 消费端节点注册、节点监听、Invoker对象创建
  2. Invoker为入参创建代理对象
代码语言:javascript
复制
public class proxy0 implements ClassGenerator.DC, EchoService, DemoService{
  public static Method[] methods;
  private InvocationHandler handler;

  public String sayHello(String paramString){
    Object[] arrayOfObject = new Object[1];
    arrayOfObject[0] = paramString;
    Object localObject = this.handler.invoke(this, methods[0], arrayOfObject);
    return ((String)localObject);
  }

  public Object $echo(Object paramObject)
  {
    Object[] arrayOfObject = new Object[1];
    arrayOfObject[0] = paramObject;
    Object localObject = this.handler.invoke(this, methods[1], arrayOfObject);
    return ((Object)localObject);
  }

  public proxy0(){
  }

  public proxy0(InvocationHandler paramInvocationHandler){
    this.handler = paramInvocationHandler;
  }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 提供端
  • 消费端
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档