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。

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
| | API (Application Programming Interface) | SPI (Service Provider Interface) | | -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | 定义 | API定义了一组用于访问和操作软件组件或服务的接口。它是一种约定,规定了组件之间如何通信和交互。 | SPI定义了一组用于扩展或替换软件功能的接口。它允许开发人员通过实现特定的接口来添加或替换现有的功能。 | | 使用 | API由应用程序直接调用,用于访问和使用特定的功能或服务。 | SPI由框架、库或平台提供,供开发人员实现并注册自定义的实现。 | | 实现 | API的实现是由框架、库或平台提供的,应用程序只需使用即可。 | SPI的实现是由开发人员提供的,必须实现特定的接口,并在应用程序中注册。 | | 扩展性 | API通常是静态的,不易扩展。应用程序只能使用已经定义好的接口。 | SPI具有高度的扩展性,允许开发人员根据需要实现自定义功能。 | | 松耦合性 | API通常与具体的实现紧密耦合,应用程序依赖于特定的实现。 | SPI具有松散耦合性,应用程序可以在不修改代码的情况下切换或替换不同的实现。 | 请注意,APISPI都是用于软件开发中的接口概念,但它们的使用和目的略有不同。API主要用于应用程序访问和使用特定功能或服务,而SPI主要用于开发人员扩展或替换现有的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值