如何实现SPI机制

这篇具有很好参考价值的文章主要介绍了如何实现SPI机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一.定义

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

 文章来源地址https://www.toymoban.com/news/detail-750543.html

到了这里,关于如何实现SPI机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SPI机制是如何规避双亲委派机制的?

    双亲委派机制是什么? 双亲委派机制指的是Java中类加载机制的特性。 双亲委派机制是作用于什么地方? 双亲委派机制主要作用于类加载的时候。 类加载器 首先需要清晰的知道,双亲委派机制指的是类加载的特性。在了解其特性之前,我们需要先了解类加载器有哪些(不考虑

    2024年02月11日
    浏览(29)
  • TypeScript--接口interface的定义,实现,继承

    可浏览博客主页的 TypeScript 专栏,会陆续添加相关文章,有问题或者可以优化的地方也希望大大门告知 共同进步 :) ts版本 Version 4.8.4 TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里,接口的作

    2023年04月12日
    浏览(32)
  • catface,使用Interface定义Controller,实现基于Http协议的RPC调用

    : Interface定义Controller;feign服务端;feign interface;Http RPC;cat-client;cat-server;catface; 概   要: catface ,使用类似 FeignClient 的Interface作为客户端发起Http请求,然后在服务端使用实现了这些Interface的类作为 Controller 角色,将客户端、服务端通过Interface耦合在一起,实

    2024年02月09日
    浏览(38)
  • 【MyBatis Plus】深入探索 MyBatis Plus 的条件构造器,自定义 SQL语句,Service 接口的实现

    在前文中,介绍了 MyBatis Plus 的一些基础功能,我们发现使用MyBatis Plus 可以非常简单的就实现对单表的增删改查操作。但是这些操作对应的 SQL 语句都非常简单,如果是面对一些复杂的 SQL 或者多表查询这样的情况,就需要我们自己来重新组织 SQL 语句了。 本文将重点探索 M

    2024年02月07日
    浏览(42)
  • Dubbo的SPI机制

    加载扩展点配置 :Dubbo SPI首先会加载所有的扩展点配置,这些配置通常是在META-INF/dubbo目录下的properties文件中定义的。每个配置文件的名称就是扩展点接口的全限定名,文件内容是扩展点实现的键值对,键是扩展点的名称,值是扩展点实现类的全限定名。 创建扩展点实例 :

    2024年01月23日
    浏览(42)
  • SPI 动态服务发现机制

    SPI(Service Provier Interface)是一种服务发现机制,通过ClassPath下的META—INF/services文件查找文件,自动加载文件中定义的类,再调用forName加载; spi可以很灵活的让接口和实现分离, 让API提供者只提供接口, 第三方来实现。 ​ 优点: 使用Java SPI机制的优势是实现解耦,使得第

    2024年01月20日
    浏览(24)
  • 【pycharm】【自定义UI】【User Interface】(用户界面)

    目录 Customizing the UI  自定义UI(用户界面) 1 How to configure your UI exactly as you want it. 1 如何配置你的UI完全按照你想要的。 2 Themes 2 主题 3 Layout 3 布局 4 Keymap  4 键映射 5 Other Customizations  5 其他定制 6 Conclusion 6 结论 1 How to configure your UI exactly as you want it.

    2024年02月21日
    浏览(38)
  • Java-SPI机制详解

    SPI 全称是 Service Provider Interface ,是一种 JDK 内置的动态加载实现扩展点的机制,通过 SPI 技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是 一种 设计理念 。 Java SPI 实际上是 基于接口的编程+策略模式+配置文件 组合实现的动态加载机

    2023年04月08日
    浏览(22)
  • ts中interface自定义结构约束和对类的约束

    一、interface自定义结构约束对后端接口返回数据 二、接口请求参数限制   三、继承  四、类中的使用 1,类的写法(必须限制useName,useAge的类型,否则报错 2、修饰符 2-1、readonly只读 2-2、public(默认值  公开的  都能访问) 2-3、protected (受保护的,只能在当前类和当前类的

    2024年02月13日
    浏览(24)
  • Android开发教程:如何利用Service实现简单的音乐播放

    android音乐播放效果,简单的服务开启。 这里将用到android的四大组件之一:Service 注意:Service是自大组件之一,需要注册。 什么是服务? 1:“Service” 意思即“服务”的意思, 像 Windows 上面的服务一样,服务是在后台上运行,承担着静悄悄的不为人所注意的工作。 2:Serv

    2023年04月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包