dubbo 知识点

1 三种扩展点注解作用是什么,有什么区别(@SPI, @Adaptive, @Activate),分别用于什么场景?

1.1 @SPI注解可以使用在类,接口和枚举类上,dubbo框架中都是使用在接口上。

主要作用是相当于一个扩展点,可以有多个不同的实现。运行时通过配置找到具体的实现类。

1.2 @Adaptive 可以标记在类,接口,枚举类和方法上。

在dubbo中主要是用在接口的方法上,直到扩展点方法执行时才决定调用是一个扩展点实现。

1.3 @Activate 可以标记在类,接口,枚举类和方法上。

主要使用在有多个扩展点实现,需要根据不同条件被激活的场景中,如fileter需要多个同时激活,因为每个filter实现的是不同功能。

2 @Adaptive扩展点注释在类上和注释在方法上有什么区别,分别是如何实现的?

2.1 如果标注在方法上,则可以通过参数动态获得实现类。(方法级别注解在第一次getExtension时,会自动生成和编译一个动态的Adaptive类,从而达到动态实现类的效果)

2.2如果标注在类上,则整个实现类会直接作为默认实现。主要是为了直接固定对应的实现而不需要动态生成代码实现。

在代码中,会缓存两个与@Adaptive有关的对象,一个缓存在cachedAdaptiveClass中,即Adaptive具体实现类的Class类型,另一个缓存在cachedAdaptiveInstance中,即Class的具体实例化对象。在扩展点初始化的时候,如果发现实现类有@Adaptive注解,则直接赋值给cachedAdaptiveClass,后续实例化类的时候,就不会在动态生成代码,直接实例化并缓存到cachedAdaptiveInstance中。如果注解在接口方法上,则会根据参数,动态获得扩展点的实现,会生成Adaptive类,再缓存到cachedAdaptiveInstance中。

// ExtensionLoader

private final HoldercachedAdaptiveInstance =new Holder();

private volatile ClasscachedAdaptiveClass =null;


参考 ExtensionLoader的方法 getAdaptiveExtension()

3 注册中心接口有多个实现类,dubbo是怎么知道默认用哪个实现类?

RegistryFactory工厂类通过@Adaptive({"protocol"}) 注解动态查找注册中心实现,根据URL中的protocol参数动态选择对应的注册中心工厂,并初始化具体的注册中心客户端。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一.概览 整体描述 dubbo利用spi扩展机制实现大量的动态扩展,要想充分了解dubbo的扩展机制,首先必须弄明...
    致虑阅读 4,413评论 0 2
  • Dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!大家是否熟悉spi...
    carl_zhao阅读 4,520评论 1 3
  • 前面我们了解过了Java的SPI扩展机制,对于Java扩展机制的原理以及优缺点也有了大概的了解,这里继续深入一下D...
    加大装益达阅读 10,530评论 2 20
  • 从两个示例代码,介绍dubbo的SPI的使用以及相关源码分析,分析了获取扩展实现和获取自适应扩展点实现的源码,最后...
    加大装益达阅读 3,616评论 0 0
  • dubbo的spi机制 dubbo的扩展点加载机制源自于java的spi扩展机制。那么,何为java的spi扩展机...
    安迪猪阅读 3,803评论 0 1

友情链接更多精彩内容