`

dubbo中的ExtensionLoader

 
阅读更多

dubbo中自己实现了一套SPI,解决了dubbo的可扩展性问题,方便了框架的各层可以在多个不同的实现之间进行来回切换。

SPI的实现主要在类ExtensionLoader中,这个类的构造函数接收一个Class类型的参数,并且这个class必须是接口,必须用注解spi进行标注。有多少个可扩展接口,就有多少个ExtensionLoader的实例。

这个类中一共有三类方法:根据名字获取实现、获取某个接口的适配实现和获取某个接口的激活实现

1、根据名字获取实现

这类方法比较好理解,如下Protocol有下面这么多的实现:



 

等号前面的是名字,等号后面的是实现,例如:如果传入dubbo就会返回DubboProtocol

下面对这个方法的源码进行分析



 

这个方法比较好理解,其实就是判断缓存,如果有直接返回,没有的话通过createExtension方法进行创建

 



 

第499行调用getExtensionClasses(),会返回这个接口的所有实现,这个方法的内部会有扫描三个目录进行初始化的过程。

 

第509行的injectExtension方法的主要作用是对获取到的这个实现的内部的属性字段进行赋值。就是如果这个类中有的字段的类型是SPI接口或者在spring容器中可以找到对应的ben,那么就对这些字段进行赋值。

 

第510到515行是对当前返回的实例进行再次包装,当然是如果这个spi接口的实现有包装类的话。如果某个实现类,有单个参数的构造函数,并且参数类型是当前SPI接口,那么这个类就是包装类。他就好对当前

要返回的类,进行包装,有可能存在多个包装器类。例如上面第一张截图中的ProtocolFilterWrapper和ProtocolListenerWrapper就是两个包装器类

 

总结一下:

(1)初始化当前spi接口的所有实现(会扫描三个目录)到内存中

(2)根据名字返回对应的实现的实例

(3)对这个实例进行属性字段的赋值,来源于其他的spi实现或者spring容器

(4)如果当前spi接口有包装器类,对当前实现进行包装,有可能有多个包装器类

这类方法基本是不会被外面的类调用,主要是为另外两类方法服务

 

2、获取SPI接口的适配实现,只会返回一个实现类。

这个方法要@Adaptive注解配合实现。这个注解可以标注在类上,也可以标注在方法上,如果是标注在方法上只能是接口方法不是类方法。

(1)如果某个SPI接口的实现类,被这个注解进行了标注,那么直接返回这个实现类

(2)如果接口的方法被这个注解进行了标注,那么会利用字节码进行动态生成一个类。

如果接口像下面这么标注



 

 



 

 

那么动态生成的方法将会是下面这样



 

 



 

 

 由于某个SPI接口的适配实现只会有一个,所有(1)的优先级大于(2),获取适配实现主要是解决,只有在程序运行期间才能却能使用哪个实现

 

3、获取SPI接口的激活实现,可以是多个

最常见的例子就是获取Filter

激活某个实现有两种方式

(1)使用注解Activate进行标注,这个注解有两个重要的参数一个是group,一个是value。这两个参数都是数组

group表示getActivateExtension方法传入的grop值如果被注解上的group数组包含,那么返回这个扩展。

value表示URL的parameter参数中,如果有一个参数的key和value数组的任何一个元素相同,那么返回这个扩展。

group和value不知道,表示不做约束,无条件激活这个实现

(2)不通过注解标注还可以在URL参数中指定实现类的名字,这个方法既可以激活某个实现,也可以去掉(1)中已经激活的实现,例如下面这个配置filter的例子



 

 

总结一下:

(1)通过注解进行标注的实现,被称为缺省扩展,包括dubbo自带的(入各种filter)和用户自定义的扩展用注解进行了标注。

(2)通过url的参数来指定实现的名字,也可以激活某个或某些实现。

(3)url的参数也可以去掉缺省扩展,规则见上面的图。

 

下面分析下代码:



 

第196行表示没有去掉全部的缺省扩展

198行变量所有的通过注解进行标注的实现

201行grop可以匹配上

203、204、205判断这个缺省扩展没有通过URL的参数去掉,isActivate判断注解的value值中任意一个元素和RUL参数的任意一个key相同

206表示此扩展被激活了,添加到list中

210排序

 



 

上面这部分代码,就是在url参数中指定扩展名字是的处理逻辑

215、216行表示没有在url参数中排除这个扩展

217就是处理和缺省扩展的排序关系

 

  • 大小: 30.7 KB
  • 大小: 35.5 KB
  • 大小: 44.7 KB
  • 大小: 3.3 KB
  • 大小: 6.2 KB
  • 大小: 37.6 KB
  • 大小: 34.7 KB
  • 大小: 68.8 KB
  • 大小: 41.3 KB
  • 大小: 30.4 KB
分享到:
评论

相关推荐

    仿Dubbo的ExtensionLoader

    仿Dubbo的ExtensionLoader maven工程....

    DUBBO 中文帮助文档

    DUBBO中文API;DUBBO中文API;DUBBO中文API;DUBBO中文API;DUBBO中文API;

    dubbo中文文档.zip

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。...本文提供了其中文文档之中的用户手册、开发手册、管理手册。

    dubbo中文文档说明

    dubbo中文文档说明。详细介绍了dubbo的使用教程。dubbo是阿里开源的一个soa框架。

    dubbo中文文档集

    dubbo中文文档集,包括用户手册,开发手册,管理员手册

    dubbo资源 dubbo-admin dubbo demo

    dubbo资源 dubbo-admin dubbo demo

    dubbo中文文档官方版本

    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。此中文文档可以让你更快更容易上手理解及应用到实际项目当中。

    尚硅谷最新dubbo视频

    本套视频从分布式系统的基本概念出发,由浅入深,讲解了RPC原理,Dubbo基本使用,Dubbo高可用场景以及Dubbo原理,涉及了分布式系统中服务注册、服务发现、负载均衡、灰度发布、集群容错、服务降级等核心概念的讲解及...

    dubbo示例代码dubbo-sample

    dubbo示例代码dubbo-sample

    dubbo视频教程|基于Dubbo的分布式系统架构实战

    Dubbo是阿里巴巴开源的分布式服务化治理框架(微服务框架),久经阿里巴巴电商平台的大规模复杂业务的高并发考验,到目前为止Dubbo仍然是开源界中体系最完善的服务化治理框架,因此Dubbo被国内大量的的互联网公司和...

    dubbo接口测试调试工具

    把deploy目录中的所有文件拷贝到F:\app\doe 如果您电脑安装了git bash,可以在bash窗口运行 ./deploy.sh start,否则如果没有安装git bash,只能打开cmd切换到F:\app\doe目录,然后执行java -jar dubbo-doe-1.0.0-...

    incubator-dubbo-dubbo-2.6.1

    incubator-dubbo-dubbo-2.6.1

    Dubbo培训与实战

    首先,从知识层面对Dubbo有一个了解和认识,请看《Dubbo培训与实战.pptx》,然后把Dubbo用到实际项目中来,请看实例代码《Dubbo实例代码(Sping+Dubbo+Maven).zip》,里面包括dubboDemoProvide和dubboDemoConsumer...

    dubbo捕获自定义异常_dubbo异常捕获_dubbo异常_自定义异常_捕捉异常_

    解决dubbo接口自定义异常的捕捉问题,dubbo消费者可以捕捉到提供者所抛出的自定义异常。

    dubbo-admin-2.5.4及dubbo-monitor-2.5.3 安装及配置

    本人实际测试过,这两个包可用。...2.修改dubbo-monitor中的conf目录中的dubbo.properties dubbo.registry.address 与 dubbo-admin中的配置一样 3.到dubbo-monitor中的bin目录下运行 start.sh脚本 ok

    dubbo全套jar

    dubbo-demo-consumer-2.0.12-assembly.tar.gz dubbo-demo-provider-2.0.12-assembly.tar.gz dubbo-monitor-simple-2.0.12-assembly.tar.gz dubbo-registry-simple-2.0.12-assembly.tar.gz zookeeper-3.4.2.tar.gz

    dubbo-2.8.4.jar

    at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.returnFromResponse(DefaultFuture.java:190) at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:110) at ...

    dubbo所有文档英文+中文.rar

    dubbo所有文档英文+中文,非常适合想要学习dubbo的程序猿,这里面包含基本所有的文档,中文和英文文档 Administrator Guide-zh.pdf,Developer Guide-zh.pdf,Dubbo_Framework_Extensions.pdf,Dubbo_RPC_Features....

    dubbo源码解析2

    dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.dubbo源码解析2.

    dubbo-2.5.8-API文档-中英对照版.zip

    赠送jar包:dubbo-2.5.8.jar; 赠送原API文档:dubbo-2.5.8-javadoc.jar; 赠送源代码:dubbo-2.5.8-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

Global site tag (gtag.js) - Google Analytics