SPI(Service Provider Interface):是 Java 提供的一种服务提供接口,用于实现框架的扩展和插件机制。
SPI 通过 ClassPath 路径下的 META-INF/services 文件夹中查找文件,并自动加载文件中所定义的类。
SPI的实现
- 定义服务接口:定义接口,作为服务的约定。
public interface Log {
void log(String message);
}
- 创建服务实现类:创建不同的实现类实现接口,实现类可以在不同包中。
public class ConsoleLogger implements Log {
@Override
public void log(String message) {
System.out.println("Console Logger: " + message);
}
}
public class FileLogger implements Log {
@Override
public void log(String message) {
System.out.println("File Logger: " + message);
}
}
- 创建配置文件:在
META-INF/services下创建一个以服务接口的全限名命名的文件,文件内容是实现类的全限名。
com.example.ConsoleLogger
com.example.FileLogger
- 加载服务实现类:通过 ServiceLoader 加载并获取具体实现类。
import java.util.ServiceLoader;
public class App {
public static void main(String[] args) {
ServiceLoader<Log> serviceLoader = ServiceLoader.load(Log.class);
for (Log log: serviceLoader) {
log.log("Hello SPI");
}
}
}