dubbo源码阅读之-java spi, dubbo spi 和 Spring spi 到底有啥区别

news2024/11/20 12:34:30

java spi, dubbo spi 和 Spring spi 到底有啥区别

  • SPI
  • Java SPI
    • 案例
    • 优缺点
  • Spring SPI
  • Dubbo SPI
    • 概述
    • 案例
    • 源码分析
  • 自己实现一个SPI

SPI

SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。
Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。

Java SPI

案例

接口

public interface Hello {
    void say();
}

实现类

public class LiHello implements Hello{
    public void say() {
        System.out.println("li hello");
    }
}
public class ZhangHello implements Hello{
    public void say() {
        System.out.println("zhang hello");
    }
}

接口全限定名 作为文件名,实现类全限定名为内容
在这里插入图片描述
com.wfg.spi.javaspi.LiHello
com.wfg.spi.javaspi.ZhangHello

public class JavaSpi {
    public static void main(String[] args) {
        ServiceLoader<Hello> load = ServiceLoader.load(Hello.class);
        load.forEach(Hello::say);

    }
}

在这里插入图片描述

调用过程:
应用程序调用ServiceLoader.load方法,创建一个新的ServiceLoader,并实例化该类中的成员变量

应用程序通过迭代器接口获取对象实例,ServiceLoader先判断成员变量providers对象中(LinkedHashMap类型)是否有缓存实例对象,如果有缓存,直接返回。

如果没有缓存,执行类的装载,

优缺点

优点

使用 Java SPI 机制的优势是实现解耦,使得接口的定义与具体业务实现分离,而不是耦合在一起。应用进程可以根据实际业务情况启用或替换具体组件。

缺点

  • 不能按需加载。虽然 ServiceLoader 做了延迟载入,但是基本只能通过遍历全部获取,也就是接口的实现类得全部载入并实例化一遍。如果你并不想用某些实现类,或者某些类实例化很耗时,它也被载入并实例化了,这就造成了浪费。

  • 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类。

  • 多个并发多线程使用 ServiceLoader 类的实例是不安全的。

  • 加载不到实现类时抛出并不是真正原因的异常,错误很难定位。

Spring SPI

Dubbo SPI

概述

Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。

案例

此时只写和java不同的地方
接口上添加@SPI 注解

@SPI("hello")
public interface Hello {
    void say();
}

配置内容是键值对方式,因此可以根据key获取实现类

dubbo会从四个目录读取文件META-INF/dubbo/internal/ 、META-INF/dubbo/ 、META-INF/services/、META-INF/dubbo/external/,文件名为接口的全限定名,内容为键值对,键为短名称(可以理解为spring中的对象的名称),值为实现类

h1=com.wfg.spi.dubbospi.LiHello
h2=com.wfg.spi.dubbospi.ZhangHello
public class DubboSpi {

    public static void main(String[] args) {
        ExtensionLoader<Hello> extensionLoader =
                ExtensionLoader.getExtensionLoader(Hello.class);
        Hello h1 = extensionLoader.getExtension("h1");
        h1.say();
        Hello h2 = extensionLoader.getExtension("h2");
        h2.say();
    }
}

Dubbo SPI 除了支持按需加载接口实现类,还增加了 IOC 和 AOP 等特性,这些特性将会在接下来的源码分析章节中一一进行介绍。

源码分析

自己实现一个SPI

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

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

相关文章

北京通信展的精华内容,都在这里!(中篇)

█ 中国移动 中国第一大运营商&#xff1a; 中国移动展出的内容非常非常多&#xff0c;既有应用&#xff0c;也有技术干货&#xff1a; 通感一体化&#xff1a; 6G&#xff1a; 猜猜这是什么&#xff1a; 揭晓答案&#xff1a; 1:2的卫星单元模型&#xff1a; RIS智能超表面&am…

HNU人工智能实验四-基于YOLOV3-DarkNet50的篮球检测模型

实验四&#xff1a;深度学习算法及应用-基于YOLOV3-DarkNet50的篮球检测模型 项目文档工程&#xff1a;https://github.com/mindspore-ai/mindspore-21-days-tutorials/tree/main/ 前言 这个实验要求做一个深度学习项目&#xff0c;做头歌的或者自己在华为云找一个都行&…

华为OD机试真题 Java 实现【最长回文子串】【牛客练习题】

一、题目描述 给定一个仅包含小写字母的字符串&#xff0c;求它的最长回文子串的长度。 所谓回文串&#xff0c;指左右对称的字符串。 所谓子串&#xff0c;指一个字符串删掉其部分前缀和后缀&#xff08;也可以不删&#xff09;的字符串 数据范围&#xff1a;字符串长度1≤s…

华为OD机试真题 JavaScript 实现【最长回文子串】【牛客练习题】

一、题目描述 给定一个仅包含小写字母的字符串&#xff0c;求它的最长回文子串的长度。 所谓回文串&#xff0c;指左右对称的字符串。 所谓子串&#xff0c;指一个字符串删掉其部分前缀和后缀&#xff08;也可以不删&#xff09;的字符串 数据范围&#xff1a;字符串长度1≤s…

锤子眼里全是钉?谈如何对现有系统进行微服务改造

1 什么是微服务架构&#xff1f; 微服务架构&#xff0c;主要是一种思想&#xff0c;并非具体的技术、框架、语言等。核心在于将现有系统拆分为功能明确&#xff0c;内聚性强&#xff0c;职责单一的微小部分&#xff0c;以服务形式对外提供&#xff0c;从而将原来的复杂大系统…

SpringBoot 通过@Profile注解配置多环境

参考资料 Springboot中的Profile注解 目录 一. 使用场景二. 前期准备三. Profile注解作用于类上3.1 配置类3.2 效果 四. Profile注解作用于方法上4.1 定义一个生产环境的注解4.2 配置类4.3 效果 一. 使用场景 在Spring中&#xff0c;可以使用配置文件的方式来指定不同环境下所…

让AI写今年高考作文,满分60你给AI打多少分呢?

随着高考的落幕&#xff0c;各地高考作文已成为我们讨论的话题。 下面是2023年全国甲卷作文题目 我们就让AI根据要求&#xff0c;写上两篇作文。作文标题也是AI起的 一 、① 标题&#xff1a;与时间赛跑&#xff0c;不为时间所困 ​ 时间&#xff0c;这位无情的审判长&#…

知识点滴 - Tumble test和Drop test

翻滚测试(Tumble test)和跌落测试(Drop test)是十分重要的方法&#xff0c;用于评估产品的维持功能的能力&#xff0c;针对的是当产品在终端用户手中的整个生命周期中经历许多碰撞和刮擦的情况。 跌落测试的随机性较强&#xff0c;而跌落测试可以控制跌落方向、撞击点等。 翻滚…

将一个正整数分解质因数(Java)

题目&#xff1a;将一个正整数分解质因数。例如&#xff1a;输入1023,打印出10233*11*31。 目录 1、解题思路 2、程序代码 3、程序输出 1、解题思路 从最小的质数开始&#xff0c;不断地将输入的正整数进行分解&#xff0c;直到无法再分解为止。具体实现方法为&#xff1a;从…

Flutter调用Rust代码操作指南

在之前的利用Rust与Flutter开发一款小工具文章中&#xff0c;我们使用Rust代码实现了一个简单的WebSocket发送功能。也在Rust库交叉编译以及在Android与iOS使用这篇中介绍了Rust库的打包以及双端的使用。 今天我们继续用之前WebSocket的代码举例&#xff0c;来介绍如何在Flutt…

chatgpt赋能python:Python怎么取出换行的数据?

Python怎么取出换行的数据&#xff1f; 在数据分析和处理中&#xff0c;我们常常需要从文件中读取数据&#xff0c;特别是当数据量很大时更是如此。在Python中&#xff0c;读取文本文件中的数据很简单&#xff0c;但是有时候读取的文本文件中可能含有换行符&#xff0c;这可能…

5.DIY可视化-拖拽设计1天搞定主流小程序-公告管理

1.DIY可视化-拖拽设计1天搞定主流小程序-公告管理 公告管理-本教程均在第一节中项目启动下操作 1.DIY可视化-拖拽设计1天搞定主流小程序-公告管理2.创建数据表执行: php think diygw:tableandapi oneHdp 3. 复制幻灯片界面进行编辑4.修改后台API5.富文本添加6.验证 :访问url : …

linux下动态链接过程

序 总是在工作中会遇到符号表&#xff0c;链接等字眼&#xff0c;之前看过《程序员自我修养》这本书&#xff0c;但是基本上都忘记了&#xff0c;这几天再刷一遍&#xff0c;顺便记录一下&#xff0c;加深记忆。 本文会完整的描述程序运行的动态加载及运行的整个流程&#xff…

大学生心理健康APP的设计与实现

摘 要&#xff1a;大学生群体本该是象牙塔中的学习者&#xff0c;是祖国未来的支柱&#xff0c;是民族复兴的期望所在&#xff0c;但是近几年大学生心理健康问题日益严峻&#xff0c;例如情感问题&#xff0c;原生家庭的问题&#xff0c;学业问题&#xff0c;与同学相处所带来…

【ps】photoshop 入门

文章目录 Adobe Photoshop 安装快捷键照片裁剪保存/导出图片复制图层新建图层及颜色填充人物轮廓调整、增高颅顶人物瘦脸、缩小鼻翼、丰唇、放大眼睛人物祛痘/祛斑背景杂质去除图像提亮调色工具 Adobe Photoshop 安装 参照 【Adobe Photoshop 2023 v24.3.0【附安装破解教程】中…

串口通讯,三种数据传输方式介绍

前言 &#xff08;1&#xff09;备考微机原理&#xff0c;这里就把这个知识点分享给和我一样不认真上课的同学们。 &#xff08;2&#xff09;虽然在我的STM32串口通讯的教程里面已经有描述这部分的内容了。但是担心有些人只是想单纯的了解这个知识点&#xff0c;所以我就又单独…

【工具】putty下载、安装、使用和常用设置教程

一&#xff0c;Putty简介 Putty是一个远程登录工具&#xff0c;适用于 Windows 和 Unix 平台的Telnet、SSH和 RLOGIN客户端。 跨平台支持&#xff1a;PuTTY 可以在多个操作系统上运行&#xff0c;包括 Windows、Linux、Mac 等&#xff0c;使得在不同的平台上使用相同的工具成为…

YOLOV1——你总能在这找到你想要的答案

目录 一&#xff1a;前言 与传统的RCNN的区别在哪&#xff1f; 二&#xff1a;YOLO-V1中心思想 三&#xff1a;计算损失 &#xff08;1&#xff09;&#xff1a;位置损失 为什么高宽要加上根号的损失&#xff1f; &#xff08;2&#xff09;&#xff1a;置信度损失 &a…

一次虚拟机centos7系统崩溃恢复记录

前两天&#xff0c;因为单独断开电源测试网络&#xff0c;结果不知道为什么&#xff0c;两台虚拟机中一台就出现紧急状态&#xff0c;看日志是下面情况 通过网上一些资料&#xff0c;说可以通过xfs_repair -v -L /dev/dm-0来修复&#xff0c;但这次我这里没有相关 看这个mappe…

【Docker】docker部署前Springboot-vue后端分离项目【实战篇】

文章目录 1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean package打包后端jar并上传到服务器编写Dockfilebuild 构建查看构建的后端镜像app …