为什么要使用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内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现 ...
随机推荐
- Nuxt3 的生命周期和钩子函数(八)
title: Nuxt3 的生命周期和钩子函数(八) date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要:本文介绍了Nuxt ...
- C#开发单实例应用程序并响应后续进程启动参数
C#默认的WinForm模板是不支持设置单实例的,也没有隔壁大哥VB.NET那样有个"生成单个实例应用程序"的勾选选项(VB某些时候要比C#更方便),实现单实例可以有多种方法: 检 ...
- PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践
大家好,我是码农先森. 回想起以前用模版渲染数据的岁月,那时都没有 API 接口开发的概念.PHP 服务端和前端 HTML.CSS.JS 代码混合式开发,也不分前端.后端程序员,大家都是全干工程师.随 ...
- Java常见问题-汇总
一.面试到底在问些什么东西? 首先你要知道,面试官的提问和你简历上写的内容是紧密联系的,所以你简历上写的技能一定要会. 一般面试包括下面几方面知识类型: Java基础.多线程.IO与NIO.虚拟机.设 ...
- CPU的保护模式
保护模式是为了克服实模式低劣的内存管理方式,物理内存地址不能直接被程序访问,程序内部的地址需要被转化为物理地址后再去访问.实模式CPU运行环境16位,保护模式32位. 寄存器扩展: 由于CPU发展到3 ...
- Git 奇幻之旅⌛️续集
第十二天:暂存未完成的修改 小明和小红在开发一个新功能时,他们需要切换到另一个分支去修复一个紧急的 bug .但是他们的当前分支上还有一些未完成的修改,他们不想提交这些修改,也不想丢弃这些修改.有一天 ...
- 24 年 “年薪百万” 的 Java 程序员,都要学什么?
大家好,我是程序员鱼皮.前几天我看了一篇由国外的 Java 架构师大佬分享的文章,主题是 "Java 架构师必会的 20 个技术". 光看这个标题,就知道在国外做 Java 开发, ...
- [oeasy]python0074_设置高亮色_color_highlight_ansi_控制终端颜色
更多颜色 回忆上次内容 上次我们搞的还是颜色 FG foreground 前景色 30-37 BG background 背景色 40-47 这些 都可以和字体样式 结合起来 难道 就这几种颜色 吗? ...
- [oeasy]python0072_自定义小动物变色_cowsay_color_boxes_asciiart
修改颜色 回忆上次内容 上次搞的是 颜色 前景颜色 总共有 7 种基本色 还有什么 好玩的 么? 可以 给小动物 上色 吗? 配合 先将cowsay结果 输出重定向 sudo apt install ...
- 构建基于Java Spring Boot和Uniapp的心理小程序:从零到一的完整指南
构建基于Java Spring Boot和Uniapp的心理小程序:从零到一的完整指南 前言 大家好,今天我们来聊聊如何使用Java Spring Boot和Uniapp构建一个心理小程序.这个项目不 ...