为什么要使用Java SPI机制
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机制的更多相关文章
- Java spi机制浅谈
最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结下java spi机制的思想. 我们系统里抽象的各个模块,往往有很多不同的实现方案,比 ...
- JDK源码解析之Java SPI机制
1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...
- 聊聊Java SPI机制
一.Java SPI机制 SPI(Service Provider Interface)是JDK内置的服务发现机制,用在不同模块间通过接口调用服务,避免对具体服务服务接口具体实现类的耦合.比如JDBC ...
- Java SPI机制实战详解及源码分析
背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...
- 组件化框架设计之Java SPI机制(三)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从深入理解java SPI机制来介绍组件化框架设计: ...
- Java SPI 机制实现解耦与本地化
SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface,可以避免在 Java 代码中写死服务的提供者,而是通过 SPI 服务加载机制进行服务的注册和 ...
- Java SPI机制详解
Java SPI机制详解 1.什么是SPI? SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个 ...
- java SPI机制
1. SPI是Service Provider Interfaces的简称.根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务 ...
- Java SPI机制学习笔记
最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...
- Java SPI机制简介
SPI 简介 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现 ...
随机推荐
- Konva 内容重叠无法触发点击事件的解决方法
写在前面: 环境:Vue3 + Konva + vite 在绘制界面时踩坑,主要是关于 listening 属性的使用 在绘制界面时,不免出现有内容重叠的情况,这会影响事件的触发 使用设置listen ...
- Spring里面bean的依赖和继承
继承 bean继承:两个类之间大多数的属性都相同,避免重复配置,通过bean标签的parent属性重用已有的Bean元素的配置信息 继承指的是配置信息的复用,和java类的继承没有关系 video.j ...
- 洛谷P1095
[NOIP2007 普及组] 守望者的逃离 题目背景 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变. 题目描述 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上. ...
- MoneyPrinterPlus全面支持本地Ollama大模型
MoneyPrinterPlus现在支持批量混剪,一键AI生成视频,一键批量发布短视频这些功能了. 之前支持的大模型是常用的云厂商,比如OpenAI,Azure,Kimi,Qianfan,Baichu ...
- OnlyOffice 部署与使用
Onlyoffice为office类文档预览支持服务,该服务需在Linux系统上运行,需要用Docker容器技术. 以下步骤皆在Linux系统中操作. 一.OnlyOffice部署 1.安装Docke ...
- [oeasy]python0016_编码_encode_编号_字节_计算机
编码(encode) 回忆上次内容 上次找到了字符和字节状态之间的映射对应关系 字符对应着二进制字节 二进制字节也对应着字符 这种字节状态是用2位16进制数来表示的 hex(n)可以把数字转化为 ...
- 搭建lnmp环境-nginx(第一步)
建议: 本次lnmp采用yum形式安装,编译安装过于繁琐,操作不好还不如yum安装,所以不推荐. 全部安装在宿主机上,如果需要安装多个版本的软件才使用docker nginx无所谓版本了 刚安装好系统 ...
- java spring boot 2 开发实战 mybtis 基础部份从搭建到第一个完整测试(从环境到测试用例二部份)
本案例是java sping boot 2.2.1 mybtis 基础部份 第一步搭建环境:安装依赖 由于我们公司项目是1.8 环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot 代 ...
- P9058 [Ynoi2004] rpmtdq 与 P9678 [ICPC2022 Jinan R] Tree Distance
思路: 注意到点对数量有 \(N^2\) 个,考虑丢掉一些无用的点对. 对于点对 \((x_1,y_1),(x_2,y_2)\),满足 \(x_1 \le x_2 < y_2 \le y_1\) ...
- Jmeter调试取样器
调试取样器(Debug Sampler),生成一个包含JMeter变量或属性值的样本,并且这些值可以在组件[查看结果树]的响应窗格中看到 组件路径:线程组->右键添加->取样器->D ...