Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在一个JAR中实现多个SPI_Java - Fatal编程技术网

Java 如何在一个JAR中实现多个SPI

Java 如何在一个JAR中实现多个SPI,java,Java,假设我有一个接口com.example.Marker,我有一个实现,例如com.example.MarkerImplA。要注册其中一个,我需要在META-INF/services/com.example.Marker中放置一个文本文件,如下所示 com.example.MarkerImplA 这就像一个咒语。现在,我在同一jar文件中有另一个实现,例如com.example.MarkerImpl2。如何实现第二个的注册?只需使用完全限定的提供者的类名添加多行即可 因此,如果您的SPI是com.

假设我有一个接口
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
有关详细信息,请参阅

提供程序配置文件

服务提供者通过在资源中放置提供者配置文件来标识自己 META-INF/services目录。文件名应包含文件的完全限定名 抽象服务类。该文件应包含以换行符分隔的唯一混凝土列表 提供程序类名。空格和制表符以及空行将被忽略。评论 字符为“#”(0x23);在每行上,第一个注释字符后面的所有字符都是 忽略。文件必须用UTF-8编码

提供商查找

使用Java1.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);
}
通过的查找将获取所有存档中的所有实现。这是通过使用

因此,您只需向类路径添加一个jar,就可以获取所提供的服务。这为您提供了构建插件体系结构的机会


这就是spring的工作原理。您只需向类路径添加一个jar,就可以使用spring特性,因为spring会扫描它的服务定义。这些定义被命名为例如
spring.handlers
。Spring处理程序是命名空间处理程序,它扩展xml解析以创建用于为创建SpringBean的。请参见,例如……

谢谢您的回答!
archive1.jar
 +- META-INF/services/com.example.Marker

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