Java的SPI机制

149 阅读1分钟

Java SPI(Service Provider Interface)是一种用于发现和加载服务实现的机制。它允许框架和库通过配置文件动态地发现和加载具体的服务实现,而无需在代码中显式引用实现类。

1.主要角色

  • Service Provider Interface (SPI): 定义服务的接口或抽象类。
  • Service Provider: 提供服务的具体实现类。
  • Service Loader: 用于查找并加载服务提供者的工具类(java.util.ServiceLoader)

2. 使用 Java SPI 的步骤

  1. 定义服务接口

这个接口就是SPI

public interface MyService { 
    void execute(); 
}
  1. 实现服务接口
public class MyServiceImpl implements MyService {
    @Override
    public void execute() {
        System.out.println("Executing MyServiceImpl");
    }
}
  1. 创建服务提供者配置文件

META-INF/services目录下创建一个以服务接口的全限定名命名的文件,文件内容是服务提供者实现类的全限定名.

例如META-INF/services/com.example.MyService的内容

com.example.MyServiceImpl
  1. 使用ServiceLoader加载服务实现

使用 ServiceLoader 动态加载并使用服务提供者

import java.util.ServiceLoader;

public class Main {
    public static void main(String[] args) {
        ServiceLoader<MyService> serviceLoader = ServiceLoader.load(MyService.class);
        for (MyService service : serviceLoader) {
            service.execute();
        }
    }
}