SPI:服务提供接口(service provide interface)
它是策略的,可配置化的接口。
在实际应用中,可能出现下面这种情况:
一个接口有多个实现类,其中一个实现类XX是默认的。
我们实现这样的要求很简单,只需要在代码里判断是否有实现类,如果没有,则设置为该实现类为XX类。
但这样其实是不利于扩展的,随着迭代的更新,未来版本的默认实现类可能会发生改变,这就涉及到了更改原代码来修改默认实现类了。
像这样的情况,选择使用SPI就最好的。
如何使用?
JDK的spi工具类是java.util.ServiceLoader。
它需要有几个条件:
1.所有的策略实现类都必须要开放空构造,以便反射创建对象。
2.在src下创建/META-INF/services文件夹,下面创建接口全类名一样的文件,内容里面写入实现类全名。
如下:
我们先写个interface,只有一个go方法
package serviceLoader;
public interface Animal {
public void go();
}
分别写个猫和狗的实现类
package serviceLoader;
public class Cat implements Animal{
@Override
public void go() {
System.out.println("猫在跑");
}
}
package serviceLoader;
public class Dog implements Animal{
@Override
public void go() {
System.out.println("狗在跳");
}
}
然后再创建/META-INF/services及文件
文件里写入:
serviceLoader.Cat
测试类如下:
public static void main(String[] args) {
ServiceLoader<Animal> loader = ServiceLoader.load(Animal.class);
Iterator<Animal> iterator = loader.iterator();
while(iterator.hasNext()){
Animal next = iterator.next();
next.go();//猫在跳
}
}
当然你可以写多个实现类。
以后迭代更新服务的时候,只需要修改该文件下的内容即可。不需要动用源码。