Java的SPI
2020-02-05 本文已影响0人
Haalo
介绍
SPI:service provider interface
Java SPI 是 JDK 内置的一种服务提供发现机制。它是Java中一种动态替换发现的机制。比如说JDBC,我们在连接数据库的时候需要用到java.sql.Driver 这个接口,但是Driver并没有实现,而是提供了一套标准的 api 接口。而是在mysql包中的com.mysql.cj.jdbc.Driver实现了Driver。
别人定义的接口我去实现。

如何实现SPI
- 需要在 classpath 下创建一个目录,该目录命名必须是:META-INF/services。
- 在该目录下创建一个 properties 文件,该文件需要满足以下几个条件:
- 文件名必须是扩展的接口的全路径名称
- 文件内部描述的是该扩展接口的所有实现类
- 文件的编码格式是 UTF-8
- 通过 java.util.ServiceLoader 的加载机制来发现
SPI 的实际应用
以JDBC为例:
META-INF/service路径下的文件里面写的就是 mysql 的驱动实现。

文件中的内容

跳转后发现是对java.sql.Driver中实现

通过 SPI 机制把 java.sql.Driver 和 mysql 的驱动做了集成。这样 就达到了各个数据库厂商自己去实现数据库连接,jdk 本身不关心你怎么实现。