JAVA—API和SPI概念

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
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/hfultrastrong/p/10481713.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


连接数据库的方式:第一种方式:ODBC:开放数据库连接是微软公司开放服务结构中有关数据库的一个组成部分,是数据库访问接口标准。ODBC是基于C语言实现的。提供了语言和数据库进行交互的一致性的接口,便于语言和数据库通信以及语言对数据库的各种操作。第二种方式:JDBC(本章重点)在Java中,
JDBCRequest 使用VariableNamesmysql:数据库连接池对象variousname:设置的变量名称 如何使用该变量a_#、b_#、c_#、d_#:代表行数a_1:第1行、第1列b_2:第2行、第2列
 1.JDBCDBC(JavaDataBaseConnectivity):Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。JDBC是数据库与Java代码的桥梁。JDBC中定义了操作数据库的各种接口和类型:增删改基本操作:(1)获取连接:Connectionconnection=
1.需要jar包的支持:java.sqljavax.sqlmysql-conneter-java...连接驱动(必须要导入)<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></depend
1.简介Activiti是一个业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。在Java工作流引擎中可谓是主流,我们的项目也是使用的这个框架进行流程相关的开发。与流程息息相关的就是我们的流程定义BPMN文件,包含有一系列
1.JDBC体系系统一组规范:接口JDBC接口(API)包括两个层次:面向应用的API:JavaAPI,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)面向数据库的API:JavaDriverAPI,供开发商开发数据库驱动程序JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接
原文链接JDBC一般指Java数据库连接(JavaDatabaseConnectivity)api应用程序接口(API):可以调用或者使用类/接口/方法等去完成某个目标。API制定的类/方法可以做什么。API由开发人员调用。spi服务提供接口(SPI):需要继承或实现某些类/接口/方法等去完成某个目标。SPI告诉你
spring.shardingsphere.datasource.names=#省略数据源配置,请参考用法#标准分表配置spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes=#描述数据源名称和实际表,分隔符为点,多个数据节点用逗号分隔,支持内联表达式。Absent表示仅对数据库进行分片
1问题Cannotloaddriverclass:com.mysql.cj.jdbc.Driver 2解决方案2.1已解决2.1.1首先,去查看项目中MySQL的版本如果找不到,说明可能还没有jdbc驱动,需要配置或者引入       (1)如果是直接引用的jar包,就去lib文件夹中查看,后缀是版
JDBC一、JDBC概述什么是JDBC?JDBC是使用Java语言操作关系型数据库的一套API。这套API是交由不同的数据库厂商实现的。我们利用JDBC编写操作数据库的代码,真正执行的是各个数据库的实现类(驱动)。全称:(JavaDataBaseConnectivity)Java数据库连接。JDBC的好处面向接口编
说明:/*需要引入依赖<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency>*/代码:objec
1.概要在“配置元件”中添加“JDBCConnectionConfiguration”。配置如下图: 2.重点:配置人大金仓数据库连接下面着重介绍人大金仓数据库连接配置:DatabaseURL输入:jdbc:kingbase8://192.132.180.101:54321/hj_yc   (备注:应输入 jdbc:kingbase8://IP:
JDBC概念:JavaDataBaseconnectivityJava数据库连接,Java语言操作数据库JDBc本质∶其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
Mybatis核心配置文件习惯上命名mybatis-config.xml,整合Spring之后,整个配置文件可以省略核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息标签顺序顺序出错会报错propertiessettingstypeAliasestypeHandlersobjectFactoryobjectWrapperFa
JDBC1.概念:JavaDataBaseConnectivityJava数据库连接,Java语言操作数据库JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
  1.出现这个问题的原因 :在安装mysql的时候时区设置的不正确,mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用+8:00格式使用的数据库是MySQL,没有指定MySQL驱动版本的情况下它自动依赖的驱动是8.0.12很高的版本,这是由于数据库和系统时区差异所造成的,在jdbc连
一、环境准备1.数据库创建2个库2个表:xdclass_shop_order_0product_order_0product_order_1ad_configproduct_order_item_0product_order_item_1xdclass_shop_order_1product_order_0product_order_1ad_configproduct_order_item_0product_order_item_1数据
编写配置文件(application.yml)spring:datasource:username:rootpassword:123456url:jdbc:mysql://localhost:3306/mybatis?useUnicode&characterEncoding=utf-8driver-class-name:com.mysql.cj.jdbc.Driver测试连接@SpringBootTestclassSprin
结构图pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http:/
MySql链接url参数详解 jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]... 常用的几个较为重要的参数: 参数名称参数说明缺省值最低版本要求 user 数据库用户名(用于连接数据库) 所有版本passWord用户密码(用于连接