我是靠谱客的博主 舒服酸奶,最近开发中收集的这篇文章主要介绍SPI机制介绍SPI机制介绍,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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!

最后

以上就是舒服酸奶为你收集整理的SPI机制介绍SPI机制介绍的全部内容,希望文章能够帮你解决SPI机制介绍SPI机制介绍所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部