gpt4 book ai didi

java - 如何在一个 JAR 中实现多个 SPI

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:02 25 4
gpt4 key购买 nike

假设我有一个接口(interface) com.example.Marker 并且我确实有一个实现,例如 com.example.MarkerImplA。要注册其中一个,我需要在 META-INF/services/com.example.Marker 中放置一个文本文件,如下所示

com.example.MarkerImplA

这就像一个魅力。现在,我在同一个 jar 文件中有另一个实现,例如 com.example.MarkerImpl2。如何实现第二个的注册?

最佳答案

只需添加多行完全限定的提供者的类名

因此,如果您的 SPI 是 com.example.Marker

META-INF/services/com.example.Marker

在新行中添加每个实现

com.example.MarkerImplA
com.example.MarkerImplB
com.example.MarkerImplC

有关详细信息,请查看 JAR File Specification

Provider-Configuration File

A service provider identifies itself by placing a provider-configuration file in the resource directory META-INF/services. The file's name should consist of the fully-qualified name of the abstract service class. The file should contain a newline-separated list of unique concrete provider-class names. Space and tab characters, as well as blank lines, are ignored. The comment character is '#' (0x23); on each line all characters following the first comment character are ignored. The file must be encoded in UTF-8.

提供商查找

使用 ServiceLoader<T> 在 Java 1.6

中引入的
ServiceLoader<Marker> markerLoader = ServiceLoader.load(com.example.Marker.class);
for (Marker marker : markerLoader ) {
// select the marker you want or use all

// only for demo
System.out.println(marker);
}

1.6 之前 您必须自己实现服务加载器或使用库。例如。 apache 发现库的 Service .

关于插件的注意事项

可以有多个META-INF/service不同部署单元中的提供程序配置文件,通常是 jar 存档。

archive1.jar
+- META-INF/services/com.example.Marker

archive2.jar
+- META-INF/services/com.example.Marker

通过 ServiceLoader<T> 查找将获取所有文件中的所有实现。这是使用 ClassLoader.getResources() 完成的.

因此,您只需将一个 jar 添加到类路径中,就可以获取提供的服务。这使您有机会构建插件架构。

这就是 Spring 的工作原理。您只需将一个 jar 添加到类路径中,spring 功能就可用了,因为 spring 会扫描它的服务定义。这些定义被命名为例如spring.handlers . Spring 处理程序是扩展 xml 解析以创建 BeanDefinition 的 namespace 处理程序那是一个 BeanFactory 用于为 ApplicationContext 创建 spring bean .参见例如spring-tx .

关于java - 如何在一个 JAR 中实现多个 SPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20220586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com