美文网首页
java的SPI机制

java的SPI机制

作者: chanyi | 来源:发表于2020-07-07 09:39 被阅读0次

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

    相关文章

      网友评论

          本文标题:java的SPI机制

          本文链接:https://www.haomeiwen.com/subject/kvwoqktx.html