SPI机制介绍

SPI机制介绍

概述

SPI即Service Provider Interface(服务提供者接口),与我们常用的API(Application Programming Inteface)概念不同:

  • SPI是面向服务提供者的,用于描述服务提供者如何扩展才能在符合服务要求的情况下提供具体的服务实现。一般用于基于某个标准接口/服务扩展或提供服务具体实现,例如JDBC的不同实现,Dubbo中也使用到了。
  • API是面向服务调用者的,用于描述服务调用者如何调用服务,服务可以为调用者提供的具体内容。

本质上SPI是一种软件开发过程中提高软件扩展性、面向接口编程的技术。

实现说明

在使用SPI开发时,服务提供者需要根据标准接口描述进行实现,实现完成后,在构建出的jar中的META-INF/services/目录里同时创建一个以服务接口全限定名命名的文件,文件内容为当前服务实现的具体实现全限定名。而服务调用者则不需要关注具体的服务实现,只需要通过java.util.ServiceLoader获取服务接口实现并面向标准接口开发即可。当需要切换不同的服务实现,则加载不同的jar包即可。

实现举例

  1. 定义一个标准服务接口,供服务提供者和服务调用者使用:

    package com.xxx.test.spi;
    
    import java.util.List;
    
    public interface Search
    {
     //定义服务方法
     public List<String> search(String paramString);
    }
  2. 服务提供者实现标准服务接口:

    DBSearch:

    package com.xxx.test.spi;
    
    import java.io.PrintStream;
    import java.util.List;
    
    public class DataBaseSearch
     implements Search
    {
     public List<String> search(String condition)
     {
       System.out.println("Search from DataBase!" + condition);
       return null;
     }
    }

    FileSearch:

    package com.xxx.test.spi;
    
    import java.io.PrintStream;
    import java.util.List;
    
    public class FileSearch
     implements Search
    {
     public List<String> search(String condition)
     {
       System.out.println("Search from FileSystem!" + condition);
       return null;
     }
    }
  3. 编辑SPI描述文件,并构建服务提供者,输出jar包:

    dbSearch.jar!META-INF/services/com.xxx.test.spi.Search文件内容:

    com.xxx.test.spi.DataBaseSearch

    fileSearch.jar!META-INF/services/com.xxx.test.spi.Search文件内容:

    com.xxx.test.spi.FileSearch
  4. 服务调用者通过java.util.ServiceLoader获取具体服务提供者,并基于标准服务接口开发:

    package com.lijie.test.spi;
    
    import java.util.Iterator;
    import java.util.ServiceLoader;
    
    public class SearchSPITest
    {
     public static void main(String[] args)
     {
       ServiceLoader search = ServiceLoader.load(Search.class);
       Iterator searchs = search.iterator();
       if (searchs.hasNext()) {
         Search curSearch = (Search)searchs.next();
         curSearch.search("test");
       }
     }
    }
  5. 通过命令行执行测试:

    java -cp searchSPIMain.jar;dbSearchSPI.jar com.lijie.test.spiSearchSPITest.java  
    //Search from DataBase!
    java -cp searchSPIMain.jar;fileSearchSPI.jar com.lijie.test.spiSearchSPITest.java
    //Search from FileSystem!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值