简介
SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要用于框架中开发,例如:Dubbo、Spring、Common-Logging、JDBC等采用SPI机制,针对同一接口采用不同实现提供给不同用户,从而提高了框架的扩展性。
Java SPI实现
Java 内置的SPI通过java.util.ServiceLoader类解析classPath和Jar包的META-INF/services/目录 下的以接口全限定名命名的文件,并加载该文件中指定的接口实现类,以此完成调用。
示例说明
创建动态接口
public interface VedioSPI{
void call();
}
实现类1
public class Mp3Vedio implements VedioSPI{
@Override
public void call(){
System.out.println("this is mp3 call");
}
}
实现类2
public class Mp4Vedio implements VedioSPI{
@Override
public void call(){
System.out.println("this is mp4 call");
}
}
在项目的source目录下新建META-INF/services/目录下,创建com.skywares.fw.juc.spi.VedioSPI文件。
com.skywares.fw.juc.spi.Mp3Vedio
com.skywares.fw.juc.spi.Mp4Vedio
相关测试
public class VedioSPITest{
public static void main(String[] args){
ServiceLoader<VedioSPI> serviceLoader = ServiceLoader.load(VedioSPI.class);
serviceLoader.forEach(t->{
t.call();
});
}
}
说明:java实现SPI是通过ServiceLoader来查找服务提供的工具类。
运行结果
this is mp3 call
this is mp4 call