SPI机制

94 阅读1分钟

SPI机制

SPI机制的全名是Service Provider Interface。 是JDK内置的一种服务提供发现机制,可以用来启动框架和替换组件,例如java.sql.Driver接口,其他不同厂商可以提供不同的实现,MySqlPostgreSQL,而Java的SPI机制可以为某个接口寻找服务实现。 Java的SPI机制的主要思想是将装配的控制权限移到程序之外,在模块化设计中这个机制尤为重要,器核心思想就是解耦。 是Java 6开始引入,是一种基于ClassLoader来发现并加载服务的机制。

  • 组成
    • Service:公开的接口或抽象类,定义了一个抽象的功能模块。
    • Service Provider:是Service接口的一个实现类。
    • ServiceLoader:是SPI的核心组件,负责在运行时发现并加载Service Provider
  • SPI机制

当一个服务提供了一个接口的实现后,需要在classPath的META-INF/services目录下创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的实现类。

  • 使用

定义一个接口

package org.demo.spi;

public interface HelloSPI {

    void sayHello();
}

定义实现类

package org.demo.spi;

public class ImageHello implements HelloSPI{
    @Override
    public void sayHello() {
        System.out.println("image");
    }
}
------
package org.demo.spi;

public class TextHello implements HelloSPI{
    @Override
    public void sayHello() {
        System.out.println("text");
    }
}

文件位置 qa1My.png

文件内容 qaNPT.png 启动

package org.demo.spi;

import java.util.ServiceLoader;

public class Main {
    public static void main(String[] args) {
        final ServiceLoader<HelloSPI> helloSPIS = ServiceLoader.load(HelloSPI.class);
        for (HelloSPI helloSPI : helloSPIS) {
            helloSPI.sayHello();
        }
    }
}
  • 规范
    • 文件路径:必须在Jar包中的META-INF/services目录下
    • 文件名称:Service接口的全限定名
    • 文件内容:Service实现类ide全限定名,如果有多个实现类,那么每一个实现类在文件夹中单独占据一行