转 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类库中的实例

?


1

2

3

4

5

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。

如何实现这种结构?

?


1

2

3

4

5

6

7

8

public class Program {

    public static void main(String[] args) throws InstantiationException,

        IllegalAccessException, ClassNotFoundException {

        Class.forName("SpiA");

        Api api = new Api("a");

        api.Send("ABC");

    }

}

 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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);

    }

}

?


1

2

3

public interface Spi {

    void send(String msg);

}

 

?


1

2

3

4

5

6

7

8

9

10

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-03 07:21:14

转 SPI和API的区别的相关文章

VC中CWinThread类以及和createthread API的区别分析_C 语言

本文实例讲述了VC中CWinThread类以及和createthread API的区别分析,分享给大家供大家参考.具体分析如下: CWinThread CObject  └CCmdTarget     └CWinThread CWinThread对象代表在一个应用程序内运行的线程.运行的主线程通常由CWinApp的派生类提供:CWinApp由CWinThread派生.另外,CWinThread对象允许一给定的应用程序拥有多个线程. CWinThread支持两种线程类型:工作者线程(Worker

小知识: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:空

android怎样调用@hide和internal API

Android有两种类型的API是不能经由SDK访问的. 第一种是位于com.android.internal包中的API.我将称之为internal API.第二种API类型是一系列被标记为@hide属性的类和方法.从严格意义上来讲,这不是一个单一的API,而是一组小的被隐藏的API,但我仍将其假设为一种API,并称之为hidden API. Hidden API 例子 你可以查看一下android的源码,并能找到一些变量.函数和类等,都被@hide属性标记了. 下面的例子就是在WifiMan

急求解决RMI的疑问??

问题描述 本人刚接触有关rmi,jndi的知识,在学习的工程中遇到了一些疑问.在测试rmi的时候我用两种方法都能得到远程方法的调用,方法一:服务器端:StringserverName="//localhost:8089/Remote_Hello";intport=8089;Registryregistry=LocateRegistry.createRegistry(port);//生成远程对象RemoteHellohello=newRemoteHello();//绑定对象Naming.

Android 2017面试题整理

似乎自去年下半年以来,大家跳槽的少了,还有有些公司裁员了,前几年火热的移动端.前端岗位也越来越少,回归理性.现在各大公司对移动Android/ios的需求基本要求都是三年以上相关经验,有过大型互联网项目经验,基础扎实.那么对于我们从事Android开发的程序员,我们究竟需要掌握哪些技术呢?面试官究竟会问什么呢?今天,结合我的面试经验,给大家整理一下. Android常见面试题整理 以我的经验,面试基本都是简单到原理循序渐进的过程,所以这里整理的时候也遵循这个思路. 1,Activity的启动模式

在MTK芯片上如何控制CPU的核数和频率-MTK PerfService

在MTK芯片上如何控制CPU的核数和频率-MTK PerfService 一句话:PerfService就是用来调整CPU/GPU资源的.对于老的API,可以更简单地讲就是调CPU核数和CPU频率的. PerfService简介 kernel中实现了两个driver,一个负责控制开关CPU的核数,叫做hot-plug驱动,另一个负责调整CPU的频率,叫做DVFS驱动. kernel中的driver会根据系统的负载情况下,自动调整使用几个CPU和调整CPU频率.如果负载高了,提高频率,或者多开几个

Windows Embedded 版 Silverlight “Cashmere”

Windows Embedded 版 Silverlight "Cashmere"   12月11日听了马宁老师的"Silverlight在嵌入式开发的体验"的总结.   微软发布了Windows Enbedded CE 6.0 R3的RTM版本,为嵌入式设备提供了相对应的Silverlight版本.(有一个概念要搞清楚Windows Enbedded并不是Windows Mobile) WE版本的Silverlight是用C++编写的一套本地代码用户界面框架,他兼

PHP API中,MYSQL与MYSQLI的持久连接区别

很久很久以前,我也是因为工作上的bug,研究了php mysql client的连接驱动mysqlnd 与libmysql之间的区别php与mysql通讯那点事,这次又遇到一件跟他们有联系的事情,mysqli与mysql持久链接的区别.写出这篇文章,用了好一个多月,其一是我太懒了,其二是工作也比较忙.最近才能腾出时间,来做这些事情.每次做总结,都要认真阅读源码,理解含义,测试验证,来确认这些细节.而每一个步骤都需要花费很长的时间,而且,还不能被打断.一旦被打断了,都需要很长时间去温习上下文.也故

web api-MVC、WEB API 和 Entity Framework之间有什么区别?

问题描述 MVC.WEB API 和 Entity Framework之间有什么区别? MVC.WEB API 和 Entity Framework之间有什么区别 解决方案 MVC:是一个程序构架结构,m-model,v-view,c-controller web api:是一个resetful框架,asp.net webapi ef:一个orm框架,实现数据与数据实体的映射和数据维护