SPI的全名为Service Provider Interface.这个是针对厂商或者插件的。一般来说对于未知的实现或者对扩展开放的系统,通常会把一些东西抽象出来,抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。这个可以通过我们的抽象工厂方法来理解这个含义,实现是可以又厂商或者开发人员自己实现。由于代码上是处于上层的一个封装者,是不会知道底层怎么去实现,那么只能通过spi的形式,让上层知道应该调用哪个抽象的具体实现。所以这里可以理解为某些jar包里,为其他开发扩展调用使用的一种方式,可以为某个接口或服务,提供一个具体的实现。

主要用到ServiceLoader这个类,ServiceLoader通过读取resources/META-INF/services/com.xxx.xxx.xxxService文件下的xxxService的spi实现类,通过反射获取对应类实例,并调用对应方法。

public class SearchFactory {private SearchFactory() {}public static Search newSearch() {Search search = null;ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);//查找spi的实现Iterator<Search> searchs = serviceLoader.iterator();if (searchs.hasNext()) {search = searchs.next();}if (search == null) {//如果没有spi实现,就是用默认的类对象实现ClassLoader classLoader = Thread.currentThread().getContextClassLoader();try {search = (Search) classLoader.loadClass(Search.defaultSearchClass).newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}return search;}
}

使用场景有:

1、javax.xml.ws.spi.Provider,这个类可以使用另外的实现,如com.sun.xml.internal.ws.spi.ProviderImpl。

这里需要在工程下的resources目录,建一个META-INF/services目录,然后创建一个文件名为javax.xml.ws.spi.Provider,文件内容为com.sun.xml.internal.ws.spi.ProviderImpl。如果对于spi没有默认实现的,那么将会报错,这里就需要按照以上格式进行添加。

关于spi的更多了解,大家可以查看我写的一个简单的代码,非常简单。多谢大家支持!

github代码:https://github.com/zhuzhenke/java-spi-test

Java SPI机制原理和使用场景相关推荐

  1. Java SPI机制原理——丑时

    ServiceLoader源代码分析 1.ServiceLoader可以用来做什么 我比较喜欢用通俗的语言来说明,ServiceLoader我用通俗的语言来讲的话,就是可以通过配置文件灵活的来指定一个 ...

  2. Flink从入门到精通100篇(十一)-Java SPI 机制在 Flink SQL 中的应用

    Java SPI 机制简介 Java SPI机制,即Java Service Provider Interface,是Java提供的基于"接口编程 + 策略模式 + 配置文件"组合 ...

  3. Java反射机制概念及应用场景

    Java反射机制概念及应用场景 Java的反射机制相信大家在平时的业务开发过程中应该很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习一下. 1. 什么是反射机制? Java反射机 ...

  4. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? 2.SPI的用途 Driver实现 Mysql DriverManager实现 spi工具类`ServiceLoader` 将自己注册到驱动管理器的驱动列 ...

  5. Java SPI机制实现插件化扩展功能

    Java SPI机制实现插件化扩展功能 1.背景 我们有一个图数据库的服务,用户希望在不修改现有源代码的情况下扩展自定义的分词器,达到可插件式扩展功能的目标. 通过Java的SPI机制实现插件式的扩展 ...

  6. java反射原理_java反射原理是什么?java反射机制原理详解

    前面给大家介绍了一下什么是java反射机制,那么下面要给大家介绍的就是java反射机制的原理,那么它的原理究竟是怎样的呢?下面就通过下面来做一下详细的了解吧. 首先我们再来介绍一下java反射机制. ...

  7. java spi机制_Java 双亲委派机制的破坏—SPI机制

    作者:程序猿微录 出自:TinyRecord 原文:tinyice.cn/articles/123 Java 双亲委派机制的破坏-SPI机制 在Java的类加载机制中,默认的就是双亲委派机制,这种委派 ...

  8. JAVA SPI机制及SPI机制在Tomcat中的应用

    SPI 是 JAVA 提供的一种服务提供发现接口,其实就是一种面向接口的编程,为接口去匹配具体服务实现的机制,这一点上与 IOC 的思想类似,都是把装配的控制权放到了程序之外,下面具体看看什么是 SP ...

  9. java spi机制_Java是如何实现自己的SPI机制的? JDK源码(一)

    注:该源码分析对应JDK版本为1.8 1 引言 这是[源码笔记]的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码. 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是 ...

最新文章

  1. python 实现判断一个列表中的一个或多个元素是否存在于一个字符串中。
  2. Ubuntu返回到Gnome经典桌面!
  3. Java多线程之并发容器(五)
  4. layui表单验证 内置自定义规则 - 使用说明
  5. C++中内联函数和宏定义的区别
  6. 泛微OA常用js代码块
  7. ThingsBoard设备在线状态-active服务端属性分析
  8. boost asio异步服务端实现步骤
  9. 51单片机实战教程之C语言基础(十 Keil C51函数库)
  10. 最公正海贼王实力排行TOP50!
  11. Android Qcom Display学习(五)
  12. Echarts 图表不能渲染问题整理
  13. 把java项目打包成安装包
  14. 如何在有限的plt下getshellcscctf_2019_qual_babystack
  15. 笔记:计算机公共基础知识学习内容——线性结构与非线性结构
  16. lua --- 基本语法学习
  17. ios振动选择_如何设置将振动但不会发出声音的iOS警报
  18. 软件设计师笔记----计算机组成与结构
  19. 面试记录2021Peking(更新中……)
  20. Win10系统PowerShell执行.ps1文件

热门文章

  1. uniapp 悬浮窗(应用内、无需授权) Ba-FloatWindow2
  2. VeriSign扩展验证EV SSL证书——128位强制型SSL服务器证书(VeriSign Secure Site Pro with EV)...
  3. 电商管理系统客户端原型分享
  4. 惊雷算法3.0即将上线,新手站长该怎么做
  5. ClickHouse ReplicatedMergeTree家族引擎
  6. 五个短笑话(超级经典...绝对喷饭)
  7. 鼠标侧键屏蔽,再也不用担心按到侧键了。
  8. 6个座位办公室最佳位置_办公室这6个位置的座位是最好的
  9. matlab如何实现横轴坐标的放缩
  10. 哈理工计算机学院学生会技术部,大学学生会技术部工作