参考文章:https://blog.51cto.com/u_13423706/5818612

SPI

概念

为某个接口寻找其实现类的机制 可以用于扩展

实现三板斧

一. 接口与实现

  1. Phone接口
/**
 * Phone接口
 */
public interface Phone {

    // 打电话
    public void call();
}
  1. AndroidPhone实现类
public class AndroidPhone implements Phone {

    @Override
    public void call() {
        System.out.println("Android Phone call.........");
    }
}
  1. IosPhone实现类
public class IosPhone implements Phone {

    @Override
    public void call() {
        System.out.println("Ios Phone call........");
    }
}

二.配置文件

在java或resource下创建META-INF.services文件夹(规定) 创建 以接口位置为名,内容为实现类的文件

JDK SPI配置_java

com.bjpowernode.spi.impl.AndroidPhone
com.bjpowernode.spi.impl.IosPhone

三.ServiceLoader加载

public class Test {
    public static void main(String[] args) {
        ServiceLoader<Phone> serviceLoader = ServiceLoader.load(Phone.class);

        serviceLoader.forEach((Phone phone)->{
            if(phone instanceof DefaultPhone){
                phone.call();
            }
            if(phone instanceof AndroidPhone){
                phone.call();
            }
            if(phone instanceof IosPhone){
                phone.call();
            }
        });
    }
}

踩坑 注意对应的文件名