zoukankan      html  css  js  c++  java
  • 4. Dubbo原理解析-代理之接口定义 (转)

    转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159


    一:ProxyFactory的接口定义

    import com.alibaba.dubbo.common.Constants;
    import com.alibaba.dubbo.common.URL;
    import com.alibaba.dubbo.common.extension.Adaptive;
    import com.alibaba.dubbo.rpc.Invoker;
    import com.alibaba.dubbo.rpc.RpcException;
    
    /**
     * @ClassName: ProxyFactory 
     * @Description:
     * @author william.liangf add by rayhong
     * @date 2015-7-5 20:24:58
     */
    @SPI("javassist")
    public interface ProxyFactory {
    
        @Adaptive({Constants.PROXY_KEY})
        <T> T getProxy(Invoker<T> invoker) throws RpcException;
    
        @Adaptive({Constants.PROXY_KEY})
        <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException;
        
    }

    1. @SPI指定默认使用javassist字节码技术来生成代理对象

    2. 接口定义了生成代理对象的方法getProxy, 入参是invoker对象

    3. 接口定义了获取invoker对象, invoker对象是个可执行对象,这里inovker对象的invoke方法其实执行的是

    根据url获取的方法对第一个入参的实体对象的调用,即:如果url的得知调用方法sayHello, 

    入参proxy为空Test对象实现test,那invoker.invoke()就是test.sayHello()

    AbstractProxyFactory: 代理工厂的公共抽象, 这里抽象实现主要是获取需要代理的接口,代理接口可以在设置在url中key为interfaces,

    如果是多个接口用逗号分隔, 如果没有在url中指定,代理invoker获取的和EchoService接口

    JdkProxyFactory: 利用jdk动态代理来创建代理,实现来说比较简单

    JDK动态代理获取代理对象

    public <T> T getProxy(Invoker<T> invoker,Class<?>[] interfaces) {
    
      return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
              interfaces, new InvokerInvocationHandler(invoker)); }

    InvokerInvocationHandler是jdk动态代理创建一定要构建的参数,这里它的invoke方法只是简单的调用了invoker.invoke方法,

    Invoker在dubbo中代表一个可执行体,一切都向它靠拢。

    获取invoker对象

    import java.lang.reflect.Method;
    import com.alibaba.dubbo.common.URL;
    import com.alibaba.dubbo.rpc.Invoker;
    import com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker;
    public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
    
            return new AbstractProxyInvoker<T>(proxy, type, url) {
    
                @Override
                protected Object doInvoke(T proxy, String methodName,
                Class<?>[] parameterTypes, Object[] arguments) throws Throwable {
    
                    Method method = proxy.getClass().getMethod(methodName, parameterTypes);
                    return method.invoke(proxy, arguments);
    
                }
            };
        }

    这里创建的 Invoker对象,执行invoke方法,其实就是利用反射利用入参执行对应对象的对应方法。

  • 相关阅读:
    Magento安装教程
    让老婆爱你的十大方法。
    easy ui layout设计
    下交叉综合症
    fileloder.js+struts2实现文件异步上传,无页面刷新效果。
    将mysql中的Blob的图片在jsp中显示
    详解CSS样式的position属性
    Struts2与Spring的整合
    Play Framework常用标签list,set,如何遍历list、map类型数据
    我所理解的团队
  • 原文地址:https://www.cnblogs.com/heart-king/p/5642736.html
Copyright © 2011-2022 走看看