SPI 与 API的区别

背景

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

理解

API Application Programming Interface

  • 大多数情况下,都是实现方来制定接口并完成对接口的不同实现,调用方仅仅依赖却无权选择不同实现。

SPI (Service Provider Interface)

  • 而如果是调用方来制定接口,实现方来针对接口来实现不同的实现。调用方来选择自己需要的实现方。

从面向接口编程说起

这里写图片描述

当我们选择在调用方实现方 中间引入 接口。上图没有给出“接口”应该位于哪个“包”中,从纯粹的可能性上考虑,我们有三种选择:

  1. 接口位于实现方所在的包中
  2. 接口位于调用方所在的包中
  3. 接口位于独立的包中

1、接口位于【调用方】所在的包中

对于类似这种情况下接口,我们将其称为 SPI, SPI的规则如下:

  • 概念上更依赖调用方。
  • 组织上位于调用方所在的包中。
  • 实现位于独立的包中。

常见的例子是:插件模式的插件。如:

  • 数据库驱动 Driver
  • 日志 Log
  • dubbo扩展点开发

2、接口位于【实现方】所在的包中

对于类似这种情况下的接口,我们将其称作为API,API的规则如下:

  • 概念上更接近实现方。
  • 组织上位于实现方所在的包中。

3、接口位于独立的包中

如果一个“接口”在一个上下文是API,在另一个上下文是SPI,那么你就可以这么组织

需要注意的事项
SPI 和 API 也不一定是接口,我这里都是指狭义的具体的接口。

这里写图片描述

Java类库中的实例


Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("select * from Users");

说明:java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。


---------------------
作者:在云端123
来源:CSDN
原文:https://blog.csdn.net/jyxmust/article/details/82562242
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

JS---------正则表达式

2019独角兽企业重金招聘Python工程师标准>>> 1.正则表达式的创建方式: 1.1 var reg new RegExp(pattern); 1.2 var reg /^正则规则$/ 2.正则规则: 2.1 [0-9] 代表数字 [A-Z] 代表大写字母 [a-z] 代表小写字母 [A-z] 代表字母 \w 查找单词字…

关于缓存异常:缓存雪崩、击穿、穿透的解决方案

关于缓存雪崩、击穿、穿透的解决方案 前言缓存雪崩 缓存雪崩的原因解决方案缓存击穿 解决方案缓存穿透 解决方案 布隆过滤器 布隆过滤器原理布隆过滤器如何使用在Java中使用布隆过滤器前言 关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿…

RobotFramework 自动化测试实战进阶篇

工具 Robotframework, 采用PO设计模式 PO模型 PO模型即Page Objects,直译意思就是“页面对象”,通俗的讲就是把一个页面,或者说把一个页面的某个区域当做一个对象,通过封装这个对象可以实现调用。 PO设计的好处 代码复用&…

Android6 0权限机制(一):介绍

本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布 Android6.0权限机制(一):介绍 Android6.0权限机制(二):封装 Android6.0权限机制(三):…

MAX10 ADC的一些基知识

MAX10 ADC 的一些知识 1、 MAX 10 内部集成的12bit SAR ADC的特点为: a、 采样速率高达1Mhz. b、 模拟通道多达18个,单个ADC多达17个,双ADC器件中有16个双功能ADC通道,2个专用的ADC。 c、 提供单端测…

Blazor University (42)JavaScript 互操作 —— 生命周期和内存泄漏

原文链接:https://blazor-university.com/javascript-interop/calling-dotnet-from-javascript/lifetimes-and-memory-leaks/生命周期和内存泄漏源代码[1]如果我们运行我们在从 Javascript 调用 .NET 中创建的应用程序并检查浏览器控制台窗口,我们会看到…

深入浅出聊布隆过滤器(Bloom Filter)

之前在网上看到过这么一段话👇 Data structures are nothing different. They are like the bookshelves of your application where you can organize your data. Different data structures will give you different facility and benefits. To properly use the …

第五周作业

本周作业内容:显示当前系统上root、fedora或user1用户的默认shell;#egrep "^(root|user1|fedora)" /etc/passwd|cut -d: -f72、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello()&#xff…

我为什么卸载了今日头条

曾经的自媒体人自述。 两三年前自媒体热曾席卷中国互联网,当时短视频还不是很火,一般的自媒体人都是以撰写文章为主,各种微信公众号层出不穷,10W的俗称 爆文(豹纹)。后来以今日头条为领头的短视频自媒体出现…

appium执行iOS测试脚本并发问题

appium1.4.XiOS9.Xxcode7.X: appium1.4.xiOS9.xxcode7.x,这一整套的配置做移动端自动化测试是测试人员常用的测试框架。关于,这一套测试框架的并发问题:基于mac端,启动多台appium服务器会导致appium的运行出错。这是因为多个appiu…

WinForm(五)控件和它的成员

窗体无疑是WinForm的主角,每个窗体都是用一个class来承载,那么窗体的控件,就是类中的私有字段了。每个窗体有三个文件,两个.cs文件,是一个分部类,Designer.cs是自动生成的C#代码,一般是拖拽控件…

Atitit.异常处理 嵌套  冗长的解决方案

Atitit.异常处理 嵌套 冗长的解决方案 1. 异常处理的需要改进的地方1 2. 异常设计的初衷是, 在程序中出现错误时, 由程序自己处理错误, 尽量不要以exit(0)这种粗暴的方式中止程序. 1 3. 正常流程和异常流程的分离。2 4. “是药三分毒”, 任何事物有缺点&#xff0c…

一文详解|增长那些事儿

目录 增长的背景 1.1 增长的定义 1.2 如何判断事物是否在增长 1.3 如何判断事物能否持续增长 如何进行增长 2.1 寻找增长机会点(人的能力) 2.1.1 发散与收剑找机会点 2.1.2 实验分析验证 2.1.3 增长洞察提取策略 2.1.4 如何找到大机会 2.2 设…

在MVC项目中使用Ninject

项目结构图: App_start文件夹中的文件是VS自己创建的,其中NinjectWebCommon类在创建之初并不存在。后面会再次提到! 添加一个Home控制器。代码如下: using EssentialTools.Models; using Ninject; using System; using System.Col…

linux IP、端口连通性测试

ssh -v -p 50001 root10.210.200.82转载于:https://www.cnblogs.com/kuiyeit/p/6723508.html

紧急通知:360 网站卫士前端公共库已停止服务

所有使用了360前端公共库的开发者和站长们,请及时更换你的前端库的链接(主要是前端库和谷歌 fonts),否则网站打开速度会极慢,甚至会在 Chrome 浏览器中崩溃。 360前端公共库曾经提供的服务有: 前端公共库&a…

一文学会Autofac的基础操作:几种实现注册方式、3种注入方式、生命周期、AOP以及过滤器实现依赖注入...

前言:直接开干。使用Autofac进行服务注册实践:新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi项目下,引用Autofac的三个包:Autofac、Autofac…

解析互联网广告术语 CPM、CPC、CPA、CPS、CPL、CPR 是什么意思

1. CPM(Cost per mille),每千次展现收费 这是一种最为常见的广告模式,也是很多网站流量变现的一种途径,这种广告不管计算点击,或者什么注册下载之类的转化,只要这个广告在网站上被正常的展现给…

JavaScript数组迭代方法(图解)

转载于:https://www.cnblogs.com/seanna/p/6724032.html

Rider调试ASP.NET Core时报thread not gc-safe的解决方法

新建了一个ASP.NET Core 5.0的Web API项目,当使用断点调试Host.CreateDefaultBuilder(args)时,进入该函数后查看中间变量的值,报错Evaluation is not allowed: The thread is not at a GC-safe point。在群里问了也没人回应,可能没…