java的SPI机制
2020-07-07 本文已影响0人
chanyi
1、概念
SPI(service provider interface)是java提供的一种服务发现机制。是一种扩展机制。它可以通过将接口的实现类的全限定类路径写入规定好的文件中,来指定接口使用那个实现类。
2、简单实现
下面通过一个实例简单说明一下。实例结构是 image.png实现步骤
1、定一个接口IColor
2、编写两个接口的实现类BlackColor和WhiteColor
3、在resoure目录下建文件夹META_INFO/services,再在此文件夹下建立一个以接口的全限定名为名称的文件
4、在文件中写入指定的实现类的全限定名。
5、执行测试程序测试是否使用文件中写的实现类
代码:
接口:
public interface IColor {
void getColor();
}
实现类1:
public class WhiteColor implements IColor {
public void getColor() {
System.out.println("white");
}
}
实现类2:
public class BlackColor implements IColor {
public void getColor() {
System.out.println("black");
}
}
测试类:
public class ColorMain {
public static void main(String[] args) {
ServiceLoader<IColor> serviceLoader = ServiceLoader.load(IColor.class);
Iterator<IColor> serviceLoaderIter = serviceLoader.iterator();
while (serviceLoaderIter.hasNext()){
IColor iColor = serviceLoaderIter.next();
iColor.getColor();
}
}
}
文件路径及内容:
文件路径
通过修改文件com.chanyi.spi.IColor中的实现类路径,可以指定接口的实现类
3实际使用案例
在mysql中使用SPI机制加载指定的数据库驱动程序
image.png
优缺点
1、优点:
解耦,框架的主要流程不用考虑具体某个实现
可扩展,应用方可以通过实现框架定义的接口,扩展框架的功能
2、缺点:
使用的ServiceLoad多线程下不保证线程安全
每次都会加载接口名文件下的实现类,不能够指定加载某个实现类(Dubbo封装SPI解决了此问题)