美文网首页
dubbo的 spi 机制

dubbo的 spi 机制

作者: gstsyyb | 来源:发表于2020-06-16 11:30 被阅读0次

    原则:面向接口编程
    ①:META-INF/services/org.speed.dubbo.spi.service.RpcService
    文件的名称是接口的名称,里面的内容是key-value 值
    pay=org.speed.dubbo.spi.service.PayRpcService,其中key为名称,value为实现类
    ②:实现类中有其他接口的实例变量,可以支持自动装入 (set 方法实现注入)
    ③:可以基于装饰方式实现代理,支持方法调用前、后拦截功能 (通过构造方法实现包装)
    ④:基于 URL 传递参数,通过参数生成代理类(通过字节码运行时生成类)
    ⑤:通过 RpcService order = ExtensionLoader.getExtensionLoader(RpcService.class).getExtension("order");
    order 为查询的具体实现类,通常情况下这个名称为动态参数
    AdaptiveClassCodeGenerator自动生成代理对象

    image.png

    备注:自动生成的代码:
    import org.apache.dubbo.common.extension.ExtensionLoader;

    //通过字节码生成的类
    public class Request$Adaptive implements org.speed.dubbo.spi.request.Request {

    public java.lang.String sendRequest(org.apache.dubbo.common.URL arg0) {
        if (arg0 == null) {
            throw new IllegalArgumentException("url == null");
        }
    
        org.apache.dubbo.common.URL url = arg0;
        String extName = url.getParameter("framework", "netty");
    
        if (extName == null) {
            throw new IllegalStateException(
                "Failed to get extension (org.speed.dubbo.spi.request.Request) name from url (" +
                url.toString() + ") use keys([framework])");
        }
    
        org.speed.dubbo.spi.request.Request extension = (org.speed.dubbo.spi.request.Request) ExtensionLoader.getExtensionLoader(org.speed.dubbo.spi.request.Request.class)
                                                                                                             .getExtension(extName);
    
        return extension.sendRequest(url);
    }
    

    }

    相关文章

      网友评论

          本文标题:dubbo的 spi 机制

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