为什么要使用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内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现 ...
随机推荐
- “进口”双核A53@1.4GHz仅188元起,超高性价比!“邮票孔”AM62x工业核心板,正式发布!
创龙科技作为TI官方合作伙伴,在2022年9月即推出搭载TI最新明星处理器AM62x的工业核心板-SOM-TL62x(B2B版本).为了让工业客户进一步降低产品成本,并提高产品连接的可靠性,我们再次推 ...
- Java反射与Fastjson的危险反序列化
Preface 在前文中,我们介绍了 Java 的基础语法和特性和 fastjson 的基础用法,本文我们将深入学习fastjson的危险反序列化以及预期相关的 Java 概念. 什么是Java反射? ...
- 开源一个常用的树目录和下拉树js组件
我写的一个常用的树目录组件,需要jquery和font-awesome支持,对于想使用自定义图标的可以重定义 fa样式即可,或者直接更换源码的样式名称. 下载地址:https://github.com ...
- manage.py“Couldn't import Django”报错的问题解决
问题分析: 在pyharm中项目可以正常运行但是在终端 终端输入python manage.py runserver首次测试项目时,出现了无法引用Django的错误. Traceback (most ...
- SSRF结合Redis未授权的打法
目录 SSRF + Redis未授权 案例 怎么构造 redis 数据包? Reference SSRF不难理解,服务器端请求伪造(英语:Server-side Request Forgery,简称S ...
- PHP str_replace() 函数详解
PHP str_replace() 函数详解 1.前言: str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写). 该函数区分大小写.请使用 str_ireplace() 函数 ...
- oeasy教您玩转vim - 1 - # 存活下来 🥊
存活下来 更新 apt 源,升级 vim vim 是什么 vim 是类 unix 系统上的一个文本编辑神器,在 Linux 系统环境中也被许多程序员使用,书写程序和文档. 我们本次课程将围绕 Vim ...
- 关于导入react native项目导致运行异常的那些事
从git上导入公司的项目,在本地运行的时候,项目无法运行.sdk,jdk,node都是使用公司规定的版本,项目中的local.properties文件sdk.dir路径也换成了自己本地的目录,结果就在 ...
- P10245 Swimming Pool题解
P10245 Swimming Pool 题意 给你四条边 \(abcd\),求这四条边是否可以组成梯形. 思路 这显然是一道简单的普通数学题. 判断是否能构成梯形只需看四条边是否能满足,上底减下底的 ...
- CCStheia添加include路径
一.在系统内找到该路径 二.复制该路径,并更改写法 C:\Users\c1519\workspace_ccstheia\OLED\user_lib 改为: C:/Users/c1519/workspa ...