1,什么是SPI
SPI全名Service Provider interface,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口, 提供给服务开发者或者服务生产商来进行实现。
Java SPI 是JDK内置的一种动态加载扩展点的实现。
这个机制在一般的业务代码中很少用到(个人接触到的业务没有用到过),但是再底层框架中却被大量使用,包括JDBC、Dubbo、Spring框架、日志接口中都有用到,不同的是有的使用Java原生的实现,有的框架则自己实现了一套SPI机制。
2,SPI 简单实现
接口
package com.demo.base.spi;
public interface Animal {
void eat();
}
几个实现类
package com.demo.base.spi;
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("老猫也爱吃饭");
}
}
package com.demo.base.spi;
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("狗子爱干饭");
}
}
package com.demo.base.spi;
public class Pig implements Animal {
@Override
public void eat() {
System.out.println("猪吃的最多");
}
}
测试类
package com.demo.base.spi;
import java.util.Iterator;
import java.util.ServiceLoader;
public class SpiDemo {
public static void main(String[] args) {
ServiceLoader<Animal> animals = ServiceLoader.load(Animal.class);
Iterator<Animal> iterator = animals.iterator();
while (iterator.hasNext()){
iterator.next().eat();
}
}
}
/META-INF/services 下定一个文件,文件名与接口权限全限定名一致,文件内容就是要发现的实体类全限定名
com.demo.base.spi.Animal
com.demo.base.spi.Cat
com.demo.base.spi.Dog
com.demo.base.spi.Pig