在Java中工作的服务提供者接口(SPI)

在Java中工作的服务提供者接口(SPI),java,interface,Java,Interface,服务提供者接口在Java中的工作方式。我一直在使用JDBC,发现SPI负责加载驱动程序类 下一行提供了驱动程序的实现类,我们可以使用迭代器()对其进行迭代 我想知道这个方法在Java内部是如何工作的。这个类提供了一些功能。你在寻找更多的信息吗 Java中的服务由服务jar中包含的服务提供者配置文件定义。此文件的名称基于服务接口的名称,类似于META-INF/services/com.example.codefactory(使用ServiceLoader文档中的示例)或META-INF/servi

服务提供者接口在Java中的工作方式。我一直在使用JDBC,发现SPI负责加载驱动程序类

下一行提供了驱动程序的实现类,我们可以使用迭代器()对其进行迭代

我想知道这个方法在Java内部是如何工作的。

这个类提供了一些功能。你在寻找更多的信息吗

Java中的服务由服务jar中包含的服务提供者配置文件定义。此文件的名称基于服务接口的名称,类似于
META-INF/services/com.example.codefactory
(使用
ServiceLoader
文档中的示例)或
META-INF/services/java.sql.Driver
(我认为您正在使用的JDBC示例)

这里要理解的关键是,特定服务的所有服务提供程序配置文件都具有相同的名称。这意味着类路径包含多个同名资源,每个服务提供者一个。方法
ClassLoader.getResources
(注意它是
getResources
而不是
getResource
)返回一个
枚举
,该
ServiceLoader
可用于迭代所有配置文件并标识每个提供者

每个配置文件只包含实现类的名称。例如,如果您查看名为
META-INF/services/java.sql.Driver
,它只有一行:
org.postgresql.Driver
ServiceLoader
只需从文件中读取实现类名,然后使用类名调用
class.forName
,然后
newInstance
创建实现类的实例,然后可以将其转换为
java.sql.Driver
或任何服务接口

如果应用程序需要关于每个服务提供商的更多信息,它通常可以通过服务接口获得这些信息。例如,接口
java.sql.Driver
包括诸如
acceptsURL
getMinorVersion
/
getMajorVersion
等方法,应用程序可以使用这些方法获取有关JDBC驱动程序的信息

ServiceLoader.load(Driver.class); // returns the ServiceLoader for Driver class, we can iterate to get all implementation classes