首页 > 其他分享 >如何实现SPI机制

如何实现SPI机制

时间:2023-12-11 19:47:15浏览次数:30  
标签:execute 如何 实现 Plugin 接口 SPI 机制 public

 一.定义

SPI(Service Provider Interface) 是一种面向接口编程的技术,它可以让一个程序根据接口约定规范自动发现和加载对应的实现类。它是一种 Java 种的接口编程规范,它定义了接口和服务提供者之间的约定规范,使得在运行时动态加载实现该接口的类。SPI 机制是通过在服务提供者接口上定义注解和在配置文件种指定实现类的方式来实现的。

### 优点: SPI 核心思想就是解耦。我只定义标准,具体实现由不同的厂商实现。

### 缺点: 不能按需加载,必须遍历所有实现并初始化,但是有点初始化可能会很耗时 、获取某个实现类的方式不够灵活,只能遍历获取 、多线程使用 ServiceLoader 不安全

 二.实现流程

当服务的提供者提供了一种接口的实现之后,需要在 classpath 下的 META-INF/services/ 目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体实现类。当其他程序需要这个服务的时候,就会找到这个类并且实例化。JDK 中查找服务的实现的工具类是:java.util.ServiceLoader。 

三.简单demo实现

一.定义接口。创建两个实现类

public interface Plugin {
    void execute();
}

public class PluginA implements Plugin {
    @Override
    public void execute() {
        System.out.println("PluginA.execute is done");
    }
}

public class PluginB implements Plugin {
    @Override
    public void execute() {
        System.out.println("PluginB.execute is done");
    }
}

二.classpath 下的 META-INF/services/下新建一个文件,文件名为Plugin的全路径名,文件内容为PluginA和PluginB的全路径名

三.模拟测试

public class PluginTest {
    public static void main(String[] args) {
        ServiceLoader<Plugin> serviceLoader=ServiceLoader.load(Plugin.class);
        Iterator<Plugin> itre =  serviceLoader.iterator();
        while(itre.hasNext()){
            //itre.next() 这行代码会对 SPI 配置的实现类进行初始化
            itre.next().execute();
        }
    }
}

//打印结果:
//PluginA.execute is done
//PluginB.execute is done

 

标签:execute,如何,实现,Plugin,接口,SPI,机制,public
From: https://www.cnblogs.com/Anti-General/p/17895395.html

相关文章

  • Go Work Stealing 机制
    一、什么是WorkStealingGo语言的WorkStealing机制是一种用于调度协程(Goroutines)的策略,有助于充分利用多核CPU,提高并发性能,降低锁竞争,从而使Go程序更高效地运行WorkStealing机制的核心思想:每个操作系统线程(M)都有一个本地任务队列,它会尽可能地先执行自己队列中的协程。当某......
  • 如何写简历-学习如何在 2023 年撰写简历所需的所有技巧、工具、模板和示例
    学习如何在2023年撰写简历所需的所有技巧、工具、模板和示例拥有一份经过精心打磨和精心撰写的简历就像在求职过程中拥有超能力一样。 当大多数人走上招聘阶梯时,你却披上了深红色的斗篷,以超音速的速度向上翱翔。本关于如何撰写简历的指南概述了创建此类令人惊叹的简历的最重......
  • 边缘智能网关如何应对环境污染难题
    随着我国工业化、城镇化的深入推进,包括大气污染在内的环境污染防治压力继续加大。为应对环境污染防治难题,佰马综合边缘计算、物联网、智能感知等技术,基于边缘智能网关打造环境污染实时监测、预警及智能干预方案,可应用于大气保护、水体保护、土壤保护、植被保护、生物保护等丰富场......
  • 算法:如何实现大整数相加?
    算法题:给你两个很大很大的整数(如100位整数),如何求出它们的和?思路:小学数学竖式拆分,各个击破。在程序中列出的“竖式”究竟是什么样子呢?我们以426709752318+ 95481253129为例,来看看大整数相加的详细步骤:第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下......
  • 一文详解大模型归因机制,幻觉问题有救了!
    作者|谢年年、python大模型的幻觉问题一直是一个亟待解决的挑战。由于大模型的训练语料来源广泛,且都是未经筛选的现实世界文本,预训练的目标也仅在于预测下一个单词,并未对生成内容的真实性进行建模和验证,这导致了大模型幻觉问题的频繁出现。为了增强模型事实准确性和可验证性,一种......
  • 装完Ubuntu后默认root用户的密码是多少?如何修改root密码
    1、Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码。可以在终端输入命令:sudopasswd然后输入当前用户的密码。2、终端会提示输入新的密码并确认,此时的密码就是root新密码。修改成功后,输入命令:suroot再输入新的密码就ok了。......
  • 智能监控平台/视频共享融合系统EasyCVR接入大华SDK后只有一路通道可云台控制该如何解
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • ChatGPT叫你如何在centos中配置javapath变量
    当使用vim编辑器时,你可以按照以下步骤来编辑bash配置文件:打开~/.bashrc文件:bashvim~/.bashrc或者,如果你选择在系统级别配置,可以使用:bashsudovim/etc/environment在vim中编辑文件:移动光标到文件末尾,按下i进入插入模式,然后添加以下行:bashexportJ......
  • 15、自定义绘制图形(双缓冲机制)
    效果图 //drawwidget.h#ifndefDRAWWIDGET_H#defineDRAWWIDGET_H#include<QObject>#include<QWidget>#include<QtGui>#include<QMouseEvent>//鼠标事件#include<QPaintEvent>//绘制事件#include<QResizeEvent>//实时获取窗口操作等的大......
  • 如何使用DC电源模块进行快速原型开发
    如何使用DC电源模块进行快速原型开发BOSHIDADC电源模块是一种用于转换电源电压的电子元件,它可以把输入的直流电压转换为不同的输出电压,让我们可以在无需改变设备硬件的情况下,实现电压的升降。它广泛应用于不同的电子设备中,比如:机器人、智能家居、LED照明等等。下面,我将为大家介......