首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务提供者接口( Service Provider Interface,SPI)在Java中工作

服务提供者接口( Service Provider Interface,SPI)在Java中工作
EN

Stack Overflow用户
提问于 2020-07-09 02:04:55
回答 1查看 305关注 0票数 1

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

下面这行代码提供了Driver的实现类,我们可以使用iterator()对其进行迭代。

代码语言:javascript
复制
ServiceLoader.load(Driver.class); // returns the ServiceLoader for Driver class, we can iterate to get all implementation classes

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 02:31:00

类中提供了quite a bit of documentation。你在寻找更多的信息吗?

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62800970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档