SPI和API的区别

以下内容来自:http://blog.csdn.net/mosquitolxw/article/details/25290315

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.

以下内容来自:http://www.cnblogs.com/happyframework/p/3349087.html

背景

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

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。

如何实现这种结构?

public class Program {
    public static void main(String[] args) throws InstantiationException,
        IllegalAccessException, ClassNotFoundException {
        Class.forName("SpiA");
        Api api = new Api("a");
        api.Send("ABC");
    }
}
import java.util.*;

public class Api {
    private static HashMap<String, Class<? extends Spi>> spis = 
        new HashMap<String, Class<? extends Spi>>();
    private String protocol;

    public Api(String protocol) {
        this.protocol = protocol;
    }

    public void Send(String msg) throws InstantiationException,
        IllegalAccessException {
        Spi spi = spis.get(protocol).newInstance();
        spi.send("消息发送开始");
        spi.send(msg);
        spi.send("消息发送结束");
    }

    public static void Register(String protocol, Class<? extends Spi> cls) {
        spis.put(protocol, cls);
    }
}
public interface Spi {
    void send(String msg);
}
public class SpiA implements Spi {
    static {
        Api.Register("a", SpiA.class);
    }

    @Override
    public void send(String msg) {
        System.out.println("SpiA:" + msg);
    }
}

说明:Spi 实现的加载可以使用很多种方式,文中是最基本的方式。

时间: 2024-11-06 21:49:02

SPI和API的区别的相关文章

宏旺半导体科普SPI NAND Flash和SPI NOR Flash的区别

我们在购买电子产品时,常常听到FLASH闪存这个词.但对于基础小白来说,可能常常搞不清楚SPI Flash.Nand Flash.Nor Flash等都是指什么,今天宏旺半导体就跟大家通俗易懂地讲解一下. 首先,我们了解一下Flash闪存本身,它则是一种非易失性存储,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础.Flash按照内部存储结构的不同,可以分为两种:Nor Flash和Nand Flash. 宏旺半导体打个

c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

系统调用与API的区别

1.为什么用户程序不能直接访问系统内核模式提供的服务? 在linux中,将程序的运行空间分为内核与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程序不能访问内核数据,也无法使用内核函数. 2.什么是系统调用? 答:系统调用就是一种特殊的接口.通过这个接口,用户可以访问内核空间.系统调用规定了用户进程进入内核的具体位置. 具体步骤:用户进程-->系统调用-->内核-->返回用户空间. 系统调用就是为了解决上述问题而引入的,是提供给用户的“特殊接口”. 系统调用规定用户进

(转)c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

IIC SPI UART通信方式的区别

1.定义上的区别 IIC :Inter-Integrated Circuit   两线式串行总线 SPI : serial peripheral interface   串行外围设备接口 UART : Universal Asynchronous Receiver/Transmitter 通用异步收发传输器 通信速率 SPI > IIC > UART SPI : 串行时钟(SCLK).主机输入从机输出(MISO).主机输出从机输入(MOSI)两条合一的数据线,1个CS(设备片选线) 串行,同步

小知识:SPI四种模式区别【转】

转自:http://home.eeworld.com.cn/my/space-uid-80086-blogid-119198.html spi四种模式SPI的相位(CPHA)和极性(CPOL)分别可以为0或1,对应的4种组合构成了SPI的4种模式(mode) Mode 0 CPOL=0, CPHA=0 Mode 1 CPOL=0, CPHA=1Mode 2 CPOL=1, CPHA=0 Mode 3 CPOL=1, CPHA=1 时钟极性CPOL: 即SPI空闲时,时钟信号SCLK的电平(1:空

Uart、SPI和I2C的区别

串口通信:UART.SPI.I2C区别[引用] 1.UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少.数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快.在多机通信上面用的最多. 2.SPI接口和上面UART相比,多了一条同步时钟线,上面UART的缺点也就是它的优点了,对通信双方的时序要求不严格不同设备之间可以很容易结合,而且通信速度非常快.一般用在产品内部元件之间的高速数据通信上面,如大容量存储器等. 3.I2C接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输

EBS与外围系统数据的交互方式——接口表与API的区别

外围系统导入到EBS目前有两种方式,一种是通过EBS系统每个模块的标准接口表,比如GL模块中的gl_interface标准接口表,当外部数据插入到这张表之后,运行系统标准日记账导入请求,将数据加载到正是表中:第二种方式,是通过调用API的方式,比如AP模块有应付发票的API,可以通过先将数据加载到一张临时表中,然后按照API里面的参数要求,将临时表中的字段与其一一对应,运行API,将临时表中的数据插入到正式表中. 通过上述例子,可以从中找到两者区别,第一种方式是将数据导入到EBS系统的标准接口表

web api和rest api的区别

DELPHI似乎很少讲WEB API,讲得多的是REST API,其实REST API是WEB API的一个子集.DELPHI完全可以开发WEB API. 相比DELPHI,PHP,.NET 喜爱用WEB API名词. 什么是web api?通讯:HTTP请求方式:get,post,put,patch....请求参数:json或xml格式的key-value类型数据响应结果:返回json或xml格式的key-value类型数据请求参数的格式决定了响应数据的格式 什么是rest api? 通讯:H