SPI机制

SPI机制

介绍

SPI(Service Provider Interface)机制

file

点击图片查看来源文章

SPI机制大致分成三步:

  1. 创建接口实现类
  2. 把接口实现类写到配置文件中(路径:项目\resources\META-INF\services\[接口的路径+接口名称|接口的完全名称])
  3. 读取配置文件(使用官方的ServiceLoader)返回实体类的对象集合
补充:

ServiceLoader 是 Java 标准库中用于加载服务提供者的工具类,它会查找配置文件 META-INF/services/xxx,其中 xxx 是服务接口的全限定名,找到配置文件后会加载其中的实现类。

SPI和API的区别是什么

API(应用程序编程接口)

  • API 是一组定义了类、方法和规范的接口,它们用于开发者之间的交互。
  • 开发者可以直接使用API,调用接口中定义的方法,而不需要了解或关心实现细节。
  • API通常由库、框架或操作系统提供,用于提供一组标准化的功能。
  • 示例:Java标准库中的java.util.List接口,开发者可以使用List接口的方法,如addgetremove等,而不需要了解不同List实现的内部工作方式。

    SPI(服务提供者接口)

  • SPI 是一种机制,用于实现组件的扩展和插件化。它允许开发者定义接口,而服务提供者可以提供不同的实现。
  • 开发者通常不直接调用SPI,而是使用加载SPI配置文件的机制来动态发现和加载服务提供者。
  • SPI通常用于创建可扩展的应用程序,其中不同的服务提供者可以在不同的JAR文件中提供不同的实现。
  • 示例:Java的JDBC(Java Database Connectivity)就是一个SPI的例子,其中不同的数据库驱动程序可以提供不同的实现,应用程序可以通过SPI机制来加载适当的驱动程序。

总结来说,API是用于直接与标准库、框架或操作系统交互的接口,而SPI是一种用于实现组件扩展和插件化的机制,用于加载和调用不同实现的接口。API通常是开发者主动调用的,而SPI通常是在运行时动态加载的。两者在用途和使用方式上有明显的区别。

使用案例

com.mysql.cj.jdbc.Driver中的运用

直接调用DriverManager.getConnection(URL, USER_NAME, PASSWORD);
他会在代码中读取java.sql.Driver配置文件自动加载com.mysql.cj.jdbc.Driver驱动
file