Dubbo Spi机制

JDK SPI 机制就存在以下一些问题:

  1. 实现类会被全部遍历并且实例化,假如我们只需要使用其中的一个实现,这在实现类很多的情况下无疑是对机器资源巨大的浪费。
  2. 无法按需获取实现类,不够灵活,我们需要遍历一遍所有实现类才能找到指定实现。

Dubbo SPI 以 JDK SPI 为参考做出了改进设计,进行了性能优化【kv缓存】以及功能增强,Dubbo SPI 机制的出现解决了上述问题。除此之外,Dubbo 的 SPI 还支持自适应扩展以及 IOC 和 AOP 等高级特性。

//扩展接口类型
private final Class<?> type;
//存储了扩展实现类和扩展名的关系
private final ConcurrentMap<Class<?>, String> cachedNames = new ConcurrentHashMap<>();
//存储了扩展名和扩展实现类之间的关系
private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<>();
//存储了扩展实现类类名与实例对象之间的关系
private final ConcurrentMap<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<>();
//扩展接口对@SPI注解配置的value
private String cachedDefaultName;

Dubbo SPI 的配置做出了改进,在 Dubbo 中有三种不同的目录可以存放 SPI 配置,用途也不同,优先级由低到高如下所示:

  1. META-INF/services/ 目录:此目录配置文件用于兼容 JDK SPI 【ServicesLoadingStrategy】。
  2. META-INF/dubbo/ 目录:此目录用于存放用户自定义 SPI 配置文件【DubboLoadingStrategy】。
  3. META-INF/dubbo/internal/ 目录:此目录用于存放 Dubbo 内部使用的 SPI 配置文件【DubboInternalLoadingStrategy】。

其中,只有ServicesLoadingStrategy在其对应目录文件中是不支持kv形式的。

public class ExtensionLoader<T> {// 利用JDK Spi机制提前初始化 LoadingStrategy的三个实现类private static volatile LoadingStrategy[] strategies = loadLoadingStrategies();
}

@SPI注解可以指定生效候选类的扩展名,否则扩展名选值为类名。候选类可以通过注解@Extension指定当前候选类的扩展名。

策略ServicesLoadingStrategy最终利用类加载器加载候选类资源的URL,得到候选类的二进制流,逐行读取,…,解析…返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Camera2开启电子防抖(EIS)和光学防抖(OIS)

刚好当前项目有录像功能&#xff0c;使用了第三方框架是基于Camera2引擎开发&#xff0c;当使用 Camera2 API 开发相机应用时&#xff0c;启用和关闭 EIS&#xff08;电子防抖&#xff09;是一个重要的功能。EIS 可以帮助减少相机拍摄时的抖动&#xff0c;从而提高图像和视频的…

python之pyqt专栏9-鼠标事件

目录 需求 UI界面 代码实现 代码解析&#xff1a; Label初始化设置 重写鼠标按下事件 重写鼠标释放事件 重写鼠标移动事件 运行结果 需求 当鼠标进入窗口时&#xff0c;点击鼠标左键&#xff0c;出现一个label并在显示光标在窗口的坐标&#xff1b;按住左键不释放拖动…

AntDB“超融合+流式实时数仓”——打造分布式数据库新纪元

&#xff08;一&#xff09; 前言 据统计&#xff0c;在信息化时代的今天&#xff0c;人们一天所接触到的信息量&#xff0c;是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外&#xff0c;人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&a…

unknown error 1060

MySQL错误1060表示"Duplicate column name"&#xff0c;意思是重复的列名。 解决方式&#xff1a; 检查表结构&#xff1a;首先&#xff0c;确保要创建的列名在表结构中不存在。可以使用DESCRIBE table_name或SHOW COLUMNS FROM table_name语句来查看表的结构&#…

网络基础--win10双网卡设置成访问不同的网络

1、背景 我日常中大部分时间都是使用外网的网卡进行办公&#xff0c;只有在连接公司服务器时才需要使用内网。由于我的电脑存在两张网卡&#xff0c;分别用于连接不同的网络&#xff08;常见情况是一张访问公司内网&#xff0c;一张访问公司外网&#xff09;&#xff0c;但是在…

Small Data Transmission(一) overview

在R16之前,RRC Inactive 不支持数据传输,UE在RRC inactive状态有data要传输时,就要通过RRC resume过程,转换到RRC connected mode才能进行数据传输。 有时候UE要传输的数据包可能会很小,且发送频率也很低,如果每次发送数据都要进行上述过程,就会增加不必要的功耗和信令…

力扣日记11.28-【二叉树篇】二叉树的最小深度

力扣日记&#xff1a;【二叉树篇】二叉树的最小深度 日期&#xff1a;2023.11.28 参考&#xff1a;代码随想录、力扣 111. 二叉树的最小深度 题目描述 难度&#xff1a;简单 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点…

TDA4VM EVM开发板调试笔记

文章目录 1. 前言2. 官网资料导读3. 安装 Linux SDK4. 制作SD 启动卡5. 验证启动1. 前言 TDA4作为一般经典的车规级SOC芯片,基于它的低阶智驾方案目前成为各家智驾方案公司的量产首选,这也使得基于TDA4的开发需求陡增,开发和使用TDA4既要熟悉Linux驱应用开发,还要熟悉传统…

des加密算法的c++ 实现

以下是一个简单的 C 语言实现 DES 加密算法的例子&#xff1a; #include <stdio.h> #include <string.h> #include <openssl/des.h>int main() {// 设置 DES 密钥const char* key "01234567";DES_cblock des_key;memcpy(des_key, key, 8);// 设置…

《opencv实用探索·五》opencv小白也能看懂的图像腐蚀

1、图像腐蚀原理简单理解&#xff1a; 腐蚀是形态学最基本的操作&#xff0c;都是针对白色部分&#xff08;高亮部分&#xff09;而言的。即原图像中高亮部分被蚕食&#xff0c;得到比原图更小的区域。 2、图像腐蚀的作用&#xff1a; &#xff08;1&#xff09;去掉毛刺&…

如何安装鸿蒙Harmony 4.0低版API9三方库

比如我要用下拉刷新三方库pulltorefresh 安装命令如下 ohpm install ohos/pulltorefresh 安装完后然后运行Demo报错,说没有isAtEnd方法 然后查看pulltorefresh 最新版2.0.4对应Harmony API10,然而我的手机是API9,所以必须找到API9的库&#xff0c;然后查看2.0.1是还是API9 所…

测试与管理 Quota

用myquota1创建一个大的文件测试 理论猜想&#xff1a;超过soft可以&#xff0c;但是超过hard就不行了&#xff0c;最大值就是hard&#xff0c;如果超过soft&#xff0c;过了17天不处理&#xff0c;最后限制值会被强制设置成soft。修改设置成hard值 切换测试用户&#xff0c;m…

对话汪源:数智时代为企业构建新的竞争力,和网易数帆的“为与不为”

CodeWave在内的诸多“主演”正在重新演绎网易数帆&#xff0c;在网易数帆的新故事里&#xff0c;做专业、底层、核心的工具&#xff0c;是其成长至今最核心的底色。 作者|斗斗 编辑|皮爷 出品|产业家 “我希望在中间层能构建一个好的生态。”网易汪源的这句话&#xff0c;让…

如何使用Qchan搭建更好保护个人隐私的本地图床并在公网可访问

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

如何让你的 Jmeter+Ant 测试报告更具吸引力?

引言 想象一下&#xff0c;你辛苦搭建了一个复杂的网站&#xff0c;投入了大量的时间和精力进行开发和测试。当你终于完成了测试并准备生成测试报告时&#xff0c;你可能会发现这个过程相当乏味&#xff0c;而对于其他人来说&#xff0c;它可能也不那么吸引人。 但是&#xf…

大语言模型新升级:亚马逊云科技2023芯片创新日

在这个充满活力的2023年芯片创新日&#xff0c;Amazon EC2 的副总裁 Dave Brown 与观众分享了他与 EC2 的15年漫长旅程。他的眼中闪烁着对技术的热情&#xff0c;他描述了自己如何与一个才华横溢的团队合作&#xff0c;在这大语言模型与生成式AI的元年中致力于为客户提供最佳的…

ELK+filebeat+kafka

无需创建logstash的端口&#xff0c;直接创建topic 远程收集mysql和httpd的日志 &#xff08;一&#xff09;安装nginx和mysql服务 1、打开mysql的日志功能 2、创建日志&#xff08;创库、创表、添加数据&#xff09; &#xff08;1&#xff09;mysql服务器上安装http system…

医疗机构临床数据合规共享解决方案斩获“金智奖”年度优秀方案奖

11月24日&#xff0c;以“并肩聚力&#xff0c;协同创新&#xff0c;共谋网络安全产业新发展”为主题的2022—2023年度中国网络安全与信息产业“金智奖”&#xff08;以下简称&#xff1a;“金智奖”&#xff09;颁奖盛典隆重举行。美创科技—医疗机构临床数据合规共享解决方案…

synchronized 关键字

目录 1 synchronized 的特性 1&#xff09;互斥 2) 刷新内存&#xff08;内存可见性&#xff09; 3) 可重入 2 synchronized 使用示例 1) 直接修饰普通方法: 2) 修饰静态方法: 3) 修饰代码块: .3 Java 标准库中的线程安全类 1 synchronized 的特性 1&#x…

java之while循环

java之while循环 用法简介 用法简介 Java中的while循环是一种基本的控制流语句&#xff0c;它允许您在满足某个条件的情况下重复执行一段代码。以下是while循环的基本语法&#xff1a; while (condition) { // code to be executed while the condition is true }其中&…