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解决了此问题)

上一篇下一篇

猜你喜欢

热点阅读