java的spi机制

    科技2026-04-20  15

    jdk的spi机制 SPI遵循如下约定: 1、当服务提供者提供了接口的一种具体实现后,在META-INF/services目录下创建一个以“接口全 限定名”为命名的文件,内容为实现类的全限定名; 2、接口实现类所在的jar包放在主程序的classpath中; 3、主程序通过java.util.ServiceLoader动态装载实现模块,它通过扫描META-INF/services目录下 的配置文件找到实现类的全限定名,把类加载到JVM; 4、SPI的实现类必须携带一个无参构造方法;

    先新建一个service

    public interface SpiService { void hello(); }

    创建两个实现类

    public class FirstSpi implements SpiService { @Override public void hello() { System.out.println("first"); } } public class SecondSpi implements SpiService { @Override public void hello() { System.out.println("second"); } }

    在resources下创建META-INF/services/com.test.service.SpiService 并在META-INF/services/com.test.service.SpiService文件中写入实现类 目录结构如下 最后测试一下

    public class SpiMain { public static void main(String[] args) { //他会自动搜索META-INF/services下接口对应的实现类 final ServiceLoader<SpiService> spiServices = ServiceLoader.load(SpiService.class); for (SpiService spiService : spiServices) { System.out.println(spiService.getClass().getName()); spiService.hello(); } } }

    输出结果

    Processed: 0.012, SQL: 9