SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。
具体是在JAR包的"src/META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名.
demo实现
package spi;
/**
* @author linzh
* @date 2018-03-01 10:10
*/
public interface Animal {
void voice();
}
package spi;
/**
* @author linzh
* @date 2018-03-01 10:11
*/
public class Cat implements Animal {
@Override
public void voice() {
System.out.println("喵喵~~");
}
}
package spi;
/**
* @author linzh
* @date 2018-03-01 10:10
*/
public class Dog implements Animal {
@Override
public void voice() {
System.out.println("汪汪~~");
}
}
META-INF\services\spi.Animal
spi.Cat
spi.Dog
package spi;
import java.util.ServiceLoader;
/**
* @author linzh
* @date 2018-03-01 10:11
*/
public class Main {
public static void main(String[] args) {
ServiceLoader<Animal> loaders = ServiceLoader.load(Animal.class);
for (Animal d : loaders) {
d.voice();
}
}
}