Java SPI(Service Provider Interface)是一种服务发现机制,它通过在Classpath路径下的META-INF/services文件夹查找文件来实现。当一个服务的API提供者想要提供服务的实现时,它需要在META-INF/services下创建一个文件,文件名对应服务的全限定名,文件内容为实现类的全限定名,每个实现类占一行。
以下是一个简单的例子:
假设我们有一个服务接口MyService
,在com.example
包下。
package com.example;
public interface MyService {
void execute();
}
服务提供者实现了这个接口,并且打包在JAR文件中。
package com.example.impl;
import com.example.MyService;
public class MyServiceImpl implements MyService {
@Override
public void execute() {
System.out.println("Service is executed.");
}
}
服务提供者需要在JAR文件内的META-INF/services
目录下创建一个名为com.example.MyService
的文件,文件内容如下:
com.example.impl.MyServiceImpl
当使用服务时,可以通过Java的ServiceLoader来加载服务实现:
import java.util.ServiceLoader;
public class ServiceLoaderExample {
public static void main(String[] args) {
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class);
for (MyService service : loader) {
service.execute();
}
}
}
当运行这段代码时,它会发现JAR文件中的服务提供者,并调用其execute
方法。这就是Java SPI的基本使用方法。