什么是SPI,和API有啥区别

Java 中区分 API 和 SPI,通俗的讲:API 和 SPI 都是相对的概念,他们的差别只在语义上,API 直接被应用开发人员使用,SPI 被框架扩展人员使用。


API (Application Programming Interface)

        定义: API是一组定义了软件组件之间交互的规则和约定的接口。提供方来制定接口并完成对接口的不同实现,调用方只需要调用即可。

        用途: 主要用于为外部开发者(应用程序开发者)提供功能访问入口,简化集成过程。例如,Java标准库中的集合框架、网络编程接口等都是API的例子。

        使用者: 通常由应用程序开发者使用,以调用特定功能或服务。

SPI (Service Provider Interface)

        定义: SPI是一种特殊类型的接口,用于服务的提供者和消费者之间动态解耦。它允许第三方为一个已存在的接口提供多种实现,并且这些实现可以在运行时被发现和加载,从而实现了高度的可插拔性和扩展性。

SPI是一种扩展机制,通常用于在应用程序中提供可插拔的实现。 调用方可选择使用提供方提供的内置实现,也可以自己实现。

        用途: SPI主要用于实现模块化设计,特别是在需要支持插件或服务替换的场景下。例如,日志框架(如Log4j、SLF4J)或数据库驱动程序常常利用SPI机制,让最终用户能够在不修改应用程序代码的情况下更换实现。

        使用者: 通常由服务提供者(如库、框架的开发者)实现,而服务消费者(可能是应用开发者或其他框架)则通过SPI机制发现并使用这些实现。

主要区别

        目的不同: API关注于暴露功能给外部使用,简化与系统的交互;SPI关注于提供一种机制,使得系统可以在运行时发现和使用不同的服务实现。

        使用者不同: API主要面向应用开发者,SPI主要面向服务或组件的提供者。

        动态性不同: API的使用相对静态,通常在编译时确定;而SPI支持动态发现和加载服务实现,具有更高的灵活性和扩展性。

所以说,API 是面向普通开发者的,提供一组功能,使他们可以利用一个库或框架来实现具体的功能。而SPI 是面向那些希望扩展或定制基础服务的开发者的,它定义了一种机制,让其他开发者可以提供新的实现或扩展现有的功能。

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

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

相关文章

图像处理ASIC设计方法 笔记24 等价表和标记代换

(一)等价表的整理与压缩 1.1 等价关系的识别与追踪 在初步标记过程完成后,等价表的整理和压缩变得至关重要。这一阶段的首要任务是从等价表的地址1开始,对等价表进行逐个扫描。在扫描过程中,系统将检查每个临时标记是否…

链表类型的无界阻塞线程安全队列-ConcurrentLinkedQueue(FIFO)

ConcurrentLinkedQueue是非阻塞线程安全(volatile不能完全保证线程安全)的队列,适用于“高并发”的场景。是一个基于链表节点的无界线程安全队列,按照 FIFO(先进先出,尾先进头先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)。 volati…

【rust工具链】

1 查看正在使用的工具链 命令:rustup show 结果显示: 从图中可以看到正在使用的是rustc 1.76.0版本,也可以看到已安装的所有版本的工具链 2 使用默认工具链 命令:rustup default 版本号 例如:rustup default 1.58…

【重学C语言】十五、文件操作

【重学C语言】十五、文件操作 文件的概念什么是流文件类型文本文件和二进制文件的区别文件指针文件指针常量预定义的文件指针stdin (标准输入)stdout (标准输出)stderr (标准错误输出)示例文件指针的声明使用文件指针悬挂指针示例文件缓冲区为什么需要缓冲区?缓冲区的类型缓冲…

Python语言绘制好看的小提琴图、箱形图、散点图、山脊图和柱状图等等

废话不多说,今天给大家分享一个,使用python绘制小提琴图、箱形图、散点图、山脊图和柱状图等等 图中的数据是随机生成的,图例,图注以及坐标题目各种信息,具体内容大家可以自己修改~ 效果图如下所示 👇&a…

AIGC时代算法工程师的面试秘籍(2024.4.29-5.12第十三式) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法,力求让读者在获得心仪offer的同时,增强技术基本面。也欢迎大家提出宝贵的优化建议,一起交流学习💪 欢迎大家关注Rocky…

『ZJUBCA Weekly Feed 07』MEV | AO超并行计算机 | Eigen layer AVS生态

一文读懂MEV:区块链的黑暗森林法则 01 💡TL;DR 这篇文章介绍了区块链中的最大可提取价值(MEV)概念,MEV 让矿工和验证者通过抢先交易、尾随交易和三明治攻击等手段获利,但也导致网络拥堵和交易费用增加。为了…

ThreadPoolExecutor线程池使用以及源码解析

文章目录 1. 引子2. 线程池源码分析2.1. 总览2.2. Executor2.3. ExecutorService2.4. AbstractExecutorService2.5. ThreadPoolExecutor构造函数核心参数阻塞队列拒绝策略核心属性线程池状态Worker 类execute() 方法addWorker() 方法runWorker() 方法getTask() 方法processWork…

奇舞周刊第529期:万字长文入门前端全球化

周五快乐(图片由midjourney生成) 奇舞推荐 ■ ■ ■ 万字长文入门前端全球化 目前国内企业正积极开拓国际市场,国际化已成为重要的发展方向,因此产品设计和开发更需考虑国际化。本文介绍了语言标识、文字阅读顺序等诸多知识。然后…

Java面试题:Java中的并发集合有哪些?请举例说明它们的使用场景

Java中的并发集合是为多线程环境设计的,它们提供了线程安全的访问和操作。以下是Java中一些常见的并发集合及其使用场景: ConcurrentHashMap: 线程安全的HashMap实现。它通过将数据分布在多个段(segment)上,每个段单独加锁&#x…

ubuntu安装samba实现共享文件windows可查看ubuntu中的文件

samba的作用:实现共享linux/ubuntu系统中的文件,在windows直接查看操作ubuntu/linux中的文件、文件夹 1、安装samba sudo apt-get install samba如果不能安装samba,则更新apt-get sudo apt-get upgrade sudo apt-get update sudo apt-get d…

LeetCode热题100—链表(一)

160.相交链表 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意&#x…

These relative modules were not found:* ../../../constant in

这个错误信息表明,你的项目在尝试加载一个相对路径模块 ../../../constant 时遇到了问题。具体来说,它在 ./node_modules/cache-loader/dist/cj 这个路径下找不到这个模块。 这里有几个可能的原因和相应的解决方案: 路径错误:首…

ts: 索引类型

一: 索引签名 索引签名用于定义对象类型,允许对象具有任意数量的属性,但属性名的类型必须是字符串(在大多数情况下)或数字(在某些特定的上下文中,如数组或类似数组的对象)。索引签名…

CHFS数据区县码(最全版本)

CHFS数据区县码(最全版本) CHFS数据区县码(2011-2019年),数据真实可用,并可赠送chfs2011-2019年公开数据。

【Unity2D 2022:Cinemachine】相机跟随与地图边界

一、导入Cinemachine工具包 1. 点击Window-Package Manager,进入包管理界面 2. 点击All,找到Cinemachine工具包,点击Install 二、相机跟随角色 1. 选中Main Camera,点击Component-Cinemachine-CinemachineBrain,新建…

linux中sysfs创建设备节点的方法和DEVICE_ATTR

使用DEVICE_ATTR宏,可以定义一个struct device_attribute设备属性,使用函数sysfs_create_group或sysfs_create_file便可以在设备目录下创建具有show和store方法的节点。能方便的进行调试。 一、使用DEVICE_ATTR构建device attribute 下面将顺着我们直接…

Sping源码(八)—Spring事件驱动

观察者模式 在介绍Spring的事件驱动之前,先简单的介绍一下设计模式中的观察者模式。 在一个简单的观察者模式只需要观察者和被观察者两个元素。简单举个栗子: 以警察盯梢犯罪嫌疑人的栗子来说: 其中犯罪嫌疑人为被观察者元素而 警察和军人为…

【启程Golang之旅】基本变量与类型讲解

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…

Fortran:forpy 嵌入Python

Fortran嵌入Python 利用forpy库,可以在Fortran程序内嵌入Python. program test_forpyuse forpy_modimplicit noneinteger::ierrierrforpy_initialize()!!---------------!!list!!---------------blocktype(list)::my_listierrlist_create(my_list)ierrmy_list%app…