服务提供者接口如何在Java中工作。我一直在使用JDBC,发现SPI负责加载驱动程序类。
下面这行代码提供了Driver的实现类,我们可以使用iterator()对其进行迭代。
ServiceLoader.load(Driver.class); // returns the ServiceLoader for Driver class, we can iterate to get all implementation classes我想知道这个方法在Java内部是如何工作的。
发布于 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)返回一个Enumeration,ServiceLoader可以使用该all遍历所有配置文件并标识每个提供者。
每个配置文件只包含实现类的名称。例如,如果您查看Postgres jar,它的名称是META-INF/services/java.sql.Driver,它只有一行:org.postgresql.Driver。ServiceLoader只是从文件中读取实现类的名称,然后使用该类名调用Class.forName,然后调用newInstance来创建实现类的实例,然后可以将该实例转换为java.sql.Driver或任何服务接口。
如果应用程序需要每个服务提供商的更多信息,它通常可以通过服务接口获取这些信息。例如,接口java.sql.Driver包括acceptsURL、getMinorVersion/getMajorVersion等方法,应用程序可以使用这些方法来获取有关JDBC驱动程序的信息。
https://stackoverflow.com/questions/62800970
复制相似问题