SPI机制

78 阅读1分钟

SPI(Service Provider Interface):是 Java 提供的一种服务提供接口,用于实现框架的扩展和插件机制。

SPI 通过 ClassPath 路径下的 META-INF/services 文件夹中查找文件,并自动加载文件中所定义的类。

SPI的实现

  1. 定义服务接口:定义接口,作为服务的约定。
public interface Log {
    void log(String message); 
}
  1. 创建服务实现类:创建不同的实现类实现接口,实现类可以在不同包中。
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); 
    } 
}
  1. 创建配置文件:在 META-INF/services 下创建一个以服务接口的全限名命名的文件,文件内容是实现类的全限名。
com.example.ConsoleLogger
com.example.FileLogger
  1. 加载服务实现类:通过 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");
        }
    }
}