Java SPI(Service Provider Interface)最早是在Java SE 6中被引入的,作为一种标准的、用于在运行时发现和加载服务提供者插件的标准机制。以前的程序猿实现JDBC连接数据库都会自己写工具类加载不同厂商的驱动来实现数据库操作,但是随着JDBC4.0之后采用了Java SPI机制,这部分工作就变的轻松了,程序猿甚至不需要Driver的具体实现是什么,路径在哪里,会自动注册,直接使用即可。随着Java的版本升级,SPI机制的实现方式也有着一些变化,比如Java9开始,SPI的配置文件可以写在module-info.java文件中,但是之前的META-INF/services/目录下的仍然受支持。

万变不离其宗,其核心思想,和它的出现要解决某些问题的目标始终是一致的。包括经常使用的开源框架如Spring、Dubbo、Hibernate、Nacos、SLF4J等使用SPI机制来实现框架的可扩展性和插件化能力。原理是一样的,实现上各有千秋,开源框架的实现可能考虑的更加全面,更加灵活。

Oracle文档对于JAVA SPI的相关描述以及简单的Demo:https://docs.oracle.com/javase/tutorial/ext/basics/spi.html

相关例子和Demo类,此处不提供,参透JDBC在各个厂商的实现和配置,以及Spring中spring.factories用法,就能知道SPI是如何工作、如何使用的。

  • SPI不是一个框架,更不是一个具体实现,更偏向于是一种机制、规约。使用这种机制,遵循这种既定的规约,就可以提高系统的灵活性、可扩展性、模块化程度等。
  • 只要按照这个规约来实现,就能提供服务自动发现的能力。
    服务提供方只需要按照规范提供Metadata,SPI自动查找和加载对应的服务实现。也就是说客户端和服务端并不需要知道具体的实现累路径。比如自己在客户端使用Class.forName("cc.oo.tt.XX")来加载,那么每次是不是都要知道具体的实现的全路径名称。有了SPI就不需要知道,自动发现和加载。就像是一个策略模式的实现,不过具体的实现由扩展(三方)处理,同时按照服务规范在自己的jar中指定具体实现,而服务不需要知道。
  • 采用这种机制,我们可以更灵活的按需编码不同的实现,提供额外的扩展而不需要改原有的代码,从而提升了系统的稳定性。
  • 依据具体的场景,合适的时机来引入这种机制,而不是‘手里拿着锤子看什么都像钉子’,见了扩展就开始套用它。技术是为业务服务的,不是用来强行炫技的。

比如我们项目中有个模块是搜索点位信息,刚开始项目内置是采用数据库检索,后来是有很多三方也想集成进来,各自有自己的流程和处理方式,但是我们作为平台有自己标准的流程和标准的接口方式;那我们只需要讲接口定义提供给对方,让他们自己实现了接口的相关服务,并在提供给我们的jar中配置好具体实现类;我们项目中有专门扫描处理标准接口的函数,会依据不同项目加载不同的jar从而使用到三房提供的服务实现。


比如假设我门实现一个简单天气组件,目的就是查看各城市当天和未来天气,那提供天气的三方服务有很多,而实际上每次只需要一个服务可用就行,这时候就可以考虑采用Java SPI机制,将各个三方的服务按需集成,而不是全部混合到一起。

为什么要使用Java SPI机制的更多相关文章

  1. Java spi机制浅谈

    最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结下java spi机制的思想. 我们系统里抽象的各个模块,往往有很多不同的实现方案,比 ...

  2. JDK源码解析之Java SPI机制

    1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...

  3. 聊聊Java SPI机制

    一.Java SPI机制 SPI(Service Provider Interface)是JDK内置的服务发现机制,用在不同模块间通过接口调用服务,避免对具体服务服务接口具体实现类的耦合.比如JDBC ...

  4. Java SPI机制实战详解及源码分析

    背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...

  5. 组件化框架设计之Java SPI机制(三)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从深入理解java SPI机制来介绍组件化框架设计: ...

  6. Java SPI 机制实现解耦与本地化

    SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface,可以避免在 Java 代码中写死服务的提供者,而是通过 SPI 服务加载机制进行服务的注册和 ...

  7. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个 ...

  8. java SPI机制

    1. SPI是Service Provider Interfaces的简称.根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务 ...

  9. Java SPI机制学习笔记

    最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...

  10. Java SPI机制简介

    SPI 简介 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现 ...

随机推荐

  1. 3562-Qt工程编译说明

  2. 典型性相关分析在SPSS中的实现

    典型性相关分析是研究两组变量(每组变量中都可能有多个指标)之间相关关系的一种多元统计方法.它能够揭示出两组变量之间的内在联系. 本文着重模型在spss中的应用,通过一道例题解释各个指标的意义.详细推导 ...

  3. Redis学习篇

    Redis 能用来做什么? 01 缓存 Redis 的最常用的用例是缓存,以加快网络应用的速度.在这种用例中,Redis 将经常请求的数据存储在内存中.它允许网络服务器频繁访问的数据.这就减少了数据库 ...

  4. 实现ASP.Net Core3.1运行在DockeDesktop下并用Nginx实现负载均衡

    一.首先去https://docs.docker.com/get-docker/下载Windows版本的Docker Desktop并安装(需要win10专业版以上操作系统,并启用CPU虚拟化和安装H ...

  5. 你有对 Vue 项目进行哪些优化?

    (1)代码层面的优化 v-if 和 v-show 区分使用场景 computed 和 watch 区分使用场景 v-for 遍历必须为 item 添加 key,且避免同时使用 v-if 图片资源懒加载 ...

  6. springboot实现异步调用demo

    springboot实现异步调用 异步调用特点 异步调用在开发程序中被广泛应用,在异步任务中,主线程不需要阻塞等待异步任务的完成,而是可以继续处理其他请求. 异步调用的特点如下: 非阻塞:主线程在调用 ...

  7. System.NotSupportedException:“无法显式设置 SplitterPanel 的高度。改在 SplitContainer 上设置 SplitterDistance。”

    System.NotSupportedException:"无法显式设置 SplitterPanel 的高度.改在 SplitContainer 上设置 SplitterDistance.& ...

  8. 2023/4/17 SCRUM个人博客

    1.我昨天的任务 学习了easydict库的基本操作 2.遇到了什么困难 没有找到合适的人脸识别库 3.我今天的任务 初步学习dlib的安装,了解dlib的基础组件

  9. WordPress基础之菜单导航栏设置

    菜单是WordPress的一项重要功能,方便用户快速打开网站页面,我们通常说的网站导航栏就是菜单.菜单通常显示在网站的顶部或者底部,以Apple官网的为例: 这篇文章我们就学习下:如何添加.删除菜单: ...

  10. 【Java】ElasticSearch 在项目里的应用

    一.前言: 好久没写笔记了,最近忙一个项目,用到ES查询,以往的笔记写ES都是搭建环境,用Kibana玩一玩 这次是直接调用API操作了,话不多说,进入主题 二.环境前提: 公司用的还是纯Elasti ...