JAVA—API和SPI概念

目录

概念

JDBC实例

自己实现一个SPI

总结

概念
英文:

What is the difference between Service Provider Interface (SPI) and Application Programming Interface (API)?

More specifically, for Java libraries, what makes them an API and/or SPI?

the API is the description of classes/interfaces/methods/... that you call and use to achieve a goal

the SPI is the description of classes/interfaces/methods/... that you extend and implement to achieve a goal

Put differently, the API tells you what a specific class/method does for you and the SPI tells you what you must do to conform.

Sometimes SPI and API overlap. For example in JDBC the Driver class is part of the SPI: If you simply want to use JDBC, you don't need to use it directly, but everyone who implements a JDBC driver must implement that class.

The Connection interface on the other hand is both SPI and API: You use it routinely when you use a JDBC driver and it needs to be implemented by the developer of the JDBC driver.

大致含义:

服务提供接口(SPI)和应用程序接口(API)有什么不同?

具体来说,在JAVA类库中,是什么组成了API或者SPI?

API是你可以调用或者使用类/接口/方法等去完成某个目标的意思。

SPI是你需要继承或实现某些类/接口/方法等去完成某个目标的意思。

换句话说,API制定的类/方法可以做什么,而SPI告诉你你必须符合什么规范。

有时候SPI和API互相重叠。例如JDBC驱动类是SPI的一部分:如果仅仅是想使用JDBC驱动,你不需要实现这个类,但如果你想要实现JdBC驱动那就必须实现这个类。

关于SPI和API:你使用JDBC驱动时可以使用现成的,该驱动由需要JDBC驱动开发者实现。

概括:

API:API由开发人员调用。

SPI:SPI是框架接口规范,需要框架开发人员实现。

JDBC实例
1.Class.forName("com.mysql.jdbc.Driver");
2.Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "123456");
3.Statement stmt = conn.createStatement();
4.ResultSet rs = stmt.executeQuery("select * from Users");
步骤2、3、4可以看做是API的调用。而DriverManager、Conn的编写则可以看做是SPI,实现制定的接口。

自己实现一个SPI
现在我们来实现一个如JDBC加载驱动这样模式的实例,我们定义一个消息驱动接口,实现并调用该驱动API。

消息驱动接口:

public interface IMsg {
//发送消息,打印到控制台
void send(String msg);
}
消息驱动管理:

用来根据不同消息驱动的实现,获得不同驱动。

public class MsgManage {

private static final Map<String, Class<? extends IMsg>> map = new HashMap<String, Class<? extends IMsg>>();

public static void register(String protocol, Class<? extends IMsg> cls) {
map.put(protocol, cls);
}

public IMsg getMsgConnection(String protocol) {
try {
return map.get(protocol).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
实现MyMsg消息驱动类:

public class MyMsg implements IMsg{

static {
MsgManage.register("my", MyMsg.class);
}

public void send(String msg) {
System.out.println("[通过MyMsg实现加载]" + msg);
}
}
实现YourMsg消息驱动类:

public class YourMsg implements IMsg{

static {
MsgManage.register("your", YourMsg.class);
}

public void send(String msg) {
System.out.println("[通过YourMsg实现加载]" + msg);
}
}
调用:

public class SpiD {

@Test
public void test() throws ClassNotFoundException {
Class.forName("com.owl.zookeeper.use.spi.MyMsg");
Class.forName("com.owl.zookeeper.use.spi.YourMsg");
IMsg my = new MsgManage().getMsgConnection("my");
IMsg your = new MsgManage().getMsgConnection("your");
my.send("你好,世界");
your.send("你好,世界");
}
}
输出:

[通过MyMsg实现加载]你好,世界
[通过YourMsg实现加载]你好,世界

总结
可以看出API主要是指调用已经实现的类去完成工作,使用者主要是程序开发人员。SPI主要是指框架扩展的规范,实现该规范可以扩展你框架的功能,使用者主要是框架开发人员。
---------------------
作者:王厚平
来源:CSDN
原文:https://blog.csdn.net/whp1473/article/details/80164254
版权声明:本文为博主原创文章,转载请附上博文链接!

JAVA—API和SPI概念的更多相关文章

  1. Java API 之 SPI机制

    SPI SPI全称是service provider interface,是Java定义的一套服务发现机制,如图: 调用方只需要面向接口,接口的实现由第三方自己去实现,服务启动的时候会自动去发现该服务 ...

  2. (转)Java API设计清单

    转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...

  3. Api 和 Spi

    目录 背景Java类库中的实例如何实现这种结构?备注 背景返回目录 Java 中区分 Api 和 Spi,通俗的讲:Api 和 Spi 都是相对的概念,他们的差别只在语义上,Api 直接被应用开发人员 ...

  4. Java API设计原则清单

    在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度.就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程 ...

  5. 结合实战和源码来聊聊Java中的SPI机制?

    写在前面 SPI机制能够非常方便的为某个接口动态指定其实现类,在某种程度上,这也是某些框架具有高度可扩展性的基础.今天,我们就从源码级别深入探讨下Java中的SPI机制. 注:文章已收录到:https ...

  6. Java中的SPI原理浅谈

    在面向对象的程序设计中,模块之间交互采用接口编程,通常情况下调用方不需要知道被调用方的内部实现细节,因为一旦涉及到了具体实现,如果需要换一种实现就需要修改代码,这违反了程序设计的"开闭原则& ...

  7. kafka2.9.2的伪分布式集群安装和demo(java api)测试

    目录: 一.什么是kafka? 二.kafka的官方网站在哪里? 三.在哪里下载?需要哪些组件的支持? 四.如何安装? 五.FAQ 六.扩展阅读   一.什么是kafka? kafka是LinkedI ...

  8. ubuntu12.04+kafka2.9.2+zookeeper3.4.5的伪分布式集群安装和demo(java api)测试

    博文作者:迦壹 博客地址:http://idoall.org/home.php?mod=space&uid=1&do=blog&id=547 转载声明:可以转载, 但必须以超链 ...

  9. HDFS基础和java api操作

    1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS ...

随机推荐

  1. python基础一 ------可迭代类型的连接

    对可迭代迭代进行连接,返回一个可迭代对象 两种方式: 并行连接 zip() 串行连接 itertools.chain from itertools import chain #并行连接 print(& ...

  2. 【DWM1000】 code 解密2一 工程初始化代码分析

    instance_init 函数追下去,绝大多数的代码都在初始化如下结构体 typedef struct { INST_MODE mode; instance_init -ANCHOR //insta ...

  3. 基于CC2530/CC2430 的光强采集系统--ADC实验

    使用光敏电阻,程序通用所有模拟量传感器 参见论坛中实例视频讲解http://bphero.com.cn/forum.php?mod=viewthread&tid=15&extra=pa ...

  4. 潭州课堂25班:Ph201805201 django 项目 第二课 git 版本控制 (课堂笔记)

    安装 git sudo apt-get install git 查看版本信息: git --version 演示: 创建个项目 创建文件夹 如果要对这个文件夹进行版本控制 先进到这个文件夹中, 命令查 ...

  5. Hass.io: add-on Samba

    { "workgroup": "WORKGROUP", "name": "hassio", "guest&qu ...

  6. list-列表练习

    #list列表取值更方便灵活 列表.数组说的都是1个东西#列表中每个字符都有一个编号,就是我们说的下标,从0开始#如果你输入的下标在列表中不存在,会报下标越界的错误 1.查询user表中下标为0的记录 ...

  7. pygame 笔记-9 图片旋转及边界反弹

    h5或flash中,可以直接对矢量对象,比如line, rectange旋转,但是pygame中,仅支持对image旋转,本以为这个是很简单的事情,但是发现还是有很多小猫腻的,记录一下: 先看一个错误 ...

  8. UML建模——用例图(Use Case Diagram)

    用例图主要用来描述角色以及角色与用例之间的连接关系.说明的是谁要使用系统,以及他们使用该系统可以做些什么.一个用例图包含了多个模型元素,如系统.参与者和用例,并且显示这些元素之间的各种关系,如泛化.关 ...

  9. PPTP服务端与客户端 修改默认PPTP默认端口1723

    linux pptp服务端:我们在Linux下建立的pptpd端口号默认是1723,有时候这个端口并不是那么的好用,不是麽?所以服务端修改端口号比较简单 修改 /etc/services 文件查找 1 ...

  10. ClickHouse高可用集群的配置

    上一篇文章写过centos 7下clickhouse rpm包安装和基本的目录结构,这里主要介绍clickhouse高可用集群的部署方案,因为对于默认的分布式表的配置,每个分片只有一份,这样如果挂掉一 ...