介绍
SPI(Service Provider Interface)机制
点击图片查看来源文章
SPI机制大致分成三步:
- 创建接口实现类
- 把接口实现类写到配置文件中(路径:
项目\resources\META-INF\services\[接口的路径+接口名称|接口的完全名称]
) - 读取配置文件(使用官方的
ServiceLoader
)返回实体类的对象集合
补充:
ServiceLoader
是 Java 标准库中用于加载服务提供者的工具类,它会查找配置文件 META-INF/services/xxx
,其中 xxx
是服务接口的全限定名,找到配置文件后会加载其中的实现类。
SPI和API的区别是什么
API(应用程序编程接口)
- API 是一组定义了类、方法和规范的接口,它们用于开发者之间的交互。
- 开发者可以直接使用API,调用接口中定义的方法,而不需要了解或关心实现细节。
- API通常由库、框架或操作系统提供,用于提供一组标准化的功能。
- 示例:Java标准库中的
java.util.List
接口,开发者可以使用List
接口的方法,如add
、get
、remove
等,而不需要了解不同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
驱动