JAVA SPI机制

258 阅读1分钟

原理:

    获取META-INF/services下的文件(名称:接口完整路径,内容:实现类完整路径)。
    根据配置得到实现类地址。
    实例化 实现类。

步骤:

    1.创建服务(接口), 创建实现类
    2.编写配置文件
    3.测试

1.创建服务(接口), 创建实现类

服务(接口)

/**
 * 动物 接口
 *
 * @author dripy
 * @date 2019/12/30 17:55
 */
public interface Zoon {
    /**
     * 获取动物类型
     */
    void getType();
}

实现类

import com.dripy.study.spi.service.Zoon;

/**
 * 动物 狗
 *
 * @author dripy
 * @date 2019/12/30 17:56
 */
public class Dog implements Zoon {

    @Override
    public void getType() {
        System.out.println("狗");
    }
}

2.编写配置文件

在META-INF/services文件下创建一个名为 服务(接口)完整地址(com.dripy.study.spi.service.Zoon) 的 文件

内容为实现类的完整地址(com.dripy.study.spi.service.impl.Dog) 如果多个就换行

3.测试


import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * 测试 JAVA SPI机制
 * 配置文件在  META-INF/services 下 (文件名 为接口全路径,内容为实现类全路径,多个就换行)
 *
 * @author dripy
 * @date 2019/12/30 17:54
 */
public class Test {

    public static void main(String[] args) {

        // 获取这个接口的加载器
        ServiceLoader<Zoon> load = ServiceLoader.load(Zoon.class);
        // 获取迭代器   hasNext和next都是 ServiceLoader 类下 LazyIterator 内部类的方法
        Iterator<Zoon> iterator = load.iterator();
        // 判断这个接口是否有实现类
        while (iterator.hasNext()) {
            // 通过 配置文件 实例化类 并转化为接口返回     重点
            Zoon next = iterator.next();
            // 调用这个接口的方法
            next.getType();
        }

    }
}

1.初始化服务加载器ServiceLoader
    ServiceLoader<Zoon> load = ServiceLoader.load(Zoon.class);
2.获取服务加载器ServiceLoader的内部迭代器
    Iterator<Zoon> iterator = load.iterator();
3.判断 META-INF/services路径下是否有这个服务的文件名称,并得到文件里面的内容(实现类的完整地址)
    while (iterator.hasNext()) {

4.获取实现类
    Zoon next = iterator.next();

以上就是JAVA SPI机制的原理