在 Java 中工作的服务提供商接口 (SPI)
Service Provider Interface(SPI) working in Java
Java 中服务提供商接口的工作原理。我一直在使用 JDBC 并发现 SPI 负责加载驱动程序 class。
下一行提供了 Driver 的实现 classes,我们可以使用 iterator() 对其进行迭代。
ServiceLoader.load(Driver.class); // returns the ServiceLoader for Driver class, we can iterate to get all implementation classes
我想知道这个方法在 Java 中是如何工作的。
class 提供了 quite a bit of documentation。您是否正在寻找更多信息?
Java 中的服务由服务 jar 中包含的服务提供者配置文件定义。此文件的名称基于服务接口的名称,类似于 META-INF/services/com.example.CodecFactory
(使用 ServiceLoader
文档中的示例)或 META-INF/services/java.sql.Driver
(对于 JDBC我认为您正在使用的示例)。
这里要理解的关键是特定服务的所有服务提供商配置文件都具有相同的名称。这意味着 classpath 包含多个具有该名称的资源,每个服务提供商一个。 ClassLoader.getResources
方法(注意它是 getResources
而不是 getResource
) returns 一个 Enumeration
ServiceLoader
可以用来遍历所有的配置文件和确定每个提供者。
每个配置文件只包含实现的名称class。例如,如果您查看名为 META-INF/services/java.sql.Driver
的 Postgres jar,它只有一行:org.postgresql.Driver
。 ServiceLoader
只是从文件中读取实现 class 名称,然后使用 class 名称调用 Class.forName
,然后 newInstance
创建一个实现实例 class,然后它可以转换为 java.sql.Driver
或任何服务接口。
如果应用需要有关每个服务提供商的更多信息,它通常可以通过服务接口获取该信息。例如,接口 java.sql.Driver
包括 acceptsURL
、getMinorVersion
/getMajorVersion
等方法,应用程序可以使用这些方法获取有关 JDBC 驱动程序的信息。
Java 中服务提供商接口的工作原理。我一直在使用 JDBC 并发现 SPI 负责加载驱动程序 class。
下一行提供了 Driver 的实现 classes,我们可以使用 iterator() 对其进行迭代。
ServiceLoader.load(Driver.class); // returns the ServiceLoader for Driver class, we can iterate to get all implementation classes
我想知道这个方法在 Java 中是如何工作的。
class 提供了 quite a bit of documentation。您是否正在寻找更多信息?
Java 中的服务由服务 jar 中包含的服务提供者配置文件定义。此文件的名称基于服务接口的名称,类似于 META-INF/services/com.example.CodecFactory
(使用 ServiceLoader
文档中的示例)或 META-INF/services/java.sql.Driver
(对于 JDBC我认为您正在使用的示例)。
这里要理解的关键是特定服务的所有服务提供商配置文件都具有相同的名称。这意味着 classpath 包含多个具有该名称的资源,每个服务提供商一个。 ClassLoader.getResources
方法(注意它是 getResources
而不是 getResource
) returns 一个 Enumeration
ServiceLoader
可以用来遍历所有的配置文件和确定每个提供者。
每个配置文件只包含实现的名称class。例如,如果您查看名为 META-INF/services/java.sql.Driver
的 Postgres jar,它只有一行:org.postgresql.Driver
。 ServiceLoader
只是从文件中读取实现 class 名称,然后使用 class 名称调用 Class.forName
,然后 newInstance
创建一个实现实例 class,然后它可以转换为 java.sql.Driver
或任何服务接口。
如果应用需要有关每个服务提供商的更多信息,它通常可以通过服务接口获取该信息。例如,接口 java.sql.Driver
包括 acceptsURL
、getMinorVersion
/getMajorVersion
等方法,应用程序可以使用这些方法获取有关 JDBC 驱动程序的信息。