原理:
获取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();