Java SPI机制了解与应用
1. 了解SPI机制
我们在平时学习和工作中总是会听到Java SPI机制,特别是使用第三方框架的时候,那么什么是SP机制呢?SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI 的作用就是为这些被扩展的 API 寻找服务实现。
2. 使用SPI机制
- 新建一个maven工程spiTest,包含两个子工程spiProvider、spiConsumer,工程结构如下:

-
在spiProvider工程中定义一个PowerJackInterface接口:
package com.jing.standard;/*** 电源插座接口*/ public interface PowerJackInterface {/*** 电源插座*/void doPowerJack();} -
在spiProvider工程中提供一个实现类:
package com.jing.standard.impl;import com.jing.standard.PowerJackInterface;public class PowerJack110V implements PowerJackInterface {@Overridepublic void doPowerJack() {System.out.println("这是110V电源插座!");} } -
在spiProvider工程中resource目录下创建
META-INF/services/目录,并且创建一个名为com.jing.standard.PowerJackInterface的文件,内容如下:com.jing.standard.impl.PowerJack110V -
在spiConsumer工程中引入spiProvider工程:
<dependency><groupId>com.jing</groupId><artifactId>spiProvider</artifactId><version>1.0.0-SNAPSHOT</version> </dependency> -
在spiConsumer工程中进行方法调用:
package com.jing;import com.jing.standard.PowerJackInterface;import java.util.ServiceLoader;public class Main {public static void main(String[] args) {ServiceLoader loader = ServiceLoader.load(PowerJackInterface.class);loader.forEach(item -> {PowerJackInterface powerJackInterface = (PowerJackInterface) item;powerJackInterface.doPowerJack();});} } -
运行结果:
这是110V电源插座! -
在spiConsumer工程中也增加一个PowerJackInterface接口实现类:
package com.jing.service;import com.jing.standard.PowerJackInterface;public class PowerJack220V implements PowerJackInterface {@Overridepublic void doPowerJack() {System.out.println("220V电源插座!");} } -
在spiConsumer工程中resource目录下创建
META-INF/services/目录,并且创建一个名为com.jing.standard.PowerJackInterface的文件,内容如下:com.jing.service.PowerJack220V -
运行结果
220V电源插座! 这是110V电源插座!
3. SPI机制总结
JDK中的SPI实现,是由ServiceLoader类根据自定义传入类加载器或者应用程序类加载器在约定好的固定路径下(ClassPath:META-INF/services/)去查找和加载第三方接口实现类。

要使用JDK中的SPI机制有几个前提条件:
- 服务提供方必须实现目标接口
- 服务提供方必须在自身ClassPath:META-INF/services/路径下建立文件,文件名为目标接口全限定名;文件内容为实现目标接口的具体实现类全限定名。
相关文章:
Java SPI机制了解与应用
1. 了解SPI机制 我们在平时学习和工作中总是会听到Java SPI机制,特别是使用第三方框架的时候,那么什么是SP机制呢?SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的接口,它可以用来…...
vue实现输入框中输完后光标自动跳到下一个输入框中
前言 最近接到这么一个需求,做一个安全码的输入框,限制为6位数,但是每一个写入的值都是一个输入框,共计6个输入框,当前输入框写入值后,光标自动跳到下一个输入框中,删除当前输入框写入的值后再自…...
如何构建 C 语言编译环境?
C语言是一种通用的编程语言,它是由Dennis Ritchie于20世纪70年代初在贝尔实验室开发的。C语言的设计目标是提供一种结构化、高效、可移植的编程语言,以支持系统编程和应用程序开发。C语言广泛用于开发操作系统、网络设备、游戏、嵌入式系统、桌面应用程序…...
电子台账:模板制作之一——列过滤(水平过滤)
1 简介列过滤即水平过滤。一般情况下,企业数据源文件中有很多数据列,其中大部分数据列中的数据对电子台账来说是没有用的。列过滤就是确定企业数据文件的哪几列有用,以及有用的列分别对应到台账(模板)的哪一列。列过滤…...
【java】Java连接mysql数据库及mysql驱动jar包下载和使用
文章目录JDBCJDBC本质:JDBC作用:跟数据库建立连接发送 SQL 语句返回处理结果操作流程和具体的连接步骤如下:操作步骤:需要导入驱动jar包 mysql-connector-java-8.0.22.jar注册驱动获取数据库连接对象 Connection定义sql获取执行sq…...
Mysql八股文
Mysql八股文 数据库的三范式是什么 第一范式:列不可再分第二范式:行可以唯一区分,主键约束第三范式:表的非主属性不能依赖与 其他表的非主属性 外键约束且三大范式是一级一级依赖的,第二范式建立在第一范式上&#x…...
解析Android ANR问题
一、ANR介绍 ANR 由消息处理机制保证,Android 在系统层实现了一套精密的机制来发现 ANR,核心原理是消息调度和超时处理。ANR 机制主体实现在系统层,所有与 ANR 相关的消息,都会经过系统进程system_server调度,具体是ActivityManagerService服务,然后派发到应用进程完成对…...
ESP32设备驱动-MicroSD Card驱动
MicroSD Card驱动 1、SDCard介绍 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器…...
XC7K160T-1FBG484I、XC7A100T-2CSG324I FPGA可编程门阵列 PDF规格书
1、XC7K160T-1FBG484I说明:Kintex-7 FPGA有-3、-2、-1、-1L和-2L速度等级,其中-3具有最高的性能。-2L器件被筛选为较低的最大静态功率,并且可以在较低的核心电压下运行,以获得比-2器件更低的动态功率。-2L工业(I)温度器件仅在VCCI…...
基于HD-RK3568-IO评估板的读写速度测试报告
1. 测试对象HD-RK3568-IOT 底板基于HD-RK3568-CORE工业级核心板设计(双网口、双CAN、5路串口),接口丰富,适用于工业现场应用需求,亦方便用户评估核心板及CPU的性能。适用于工业自动化控制、人机界面、中小型医疗分析器…...
jconsole远程linux下的tomcat
修改Tomcat的配置 进去 Tomcat 安装目录下的 bin 目录,编辑 catalina.sh vi catalina.sh定位到 ----- Execute The Requested Command ----------------------------------------- vi 编辑模式下,点击 Esc,输入 / ,然后粘贴 -…...
Redis和MySQL如何保持数据一致性?
在高并发的场景下,大量的请求直接访问MySQL很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,MySQL和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。1.…...
频谱分析仪的工作原理
频谱分析仪是一种专门用于测量电信号频谱特征的精密仪器。它采用了一种将信号转换成频谱的方法,使得用户可以直观地了解信号的频谱密度,并通过分析频率分布来进行信号分析。频谱分析仪的工作原理基于傅里叶变换。傅里叶变换是一种将时间域信号转换为频率…...
docker项目自动化部署脚本(认真排版、工作积累)
要解决什么问题? 把日益复杂化、工程化的开发环境,以及生产环境,变得简单,自动化部署。 达到什么效果? 环境处处一致,并且自动化部署,提升生产力,又快又好。 当您更换电脑、更换…...
【经验分享】使用了6年的实时操作系统,是时候梳理一下它的知识点了 | 文末赠书4本
使用了6年的实时操作系统,是时候梳理一下它的知识点了 摘要: 本文简单介绍了博主学习操作系统的心路历程,同时还给大家总结了一下当下流行的几种实时操作系统,以及在工程中OSAL应该如何设计。希望对大家有所启发和帮助。 文章目录…...
蓝桥杯C/C++程序设计 往届真题汇总(进阶篇)
文章目录1. 最短路2. 数字三角形3. 递增序列4. 杨辉三角形5. 跳跃6. 路径7. 迷宫8. 装饰珠9. 明码10. 字串分值11. 作物杂交12. 承压计算13. 全球变暖14. 直线15. 平面切分1. 最短路 题目描述: 如下图所示,G是一个无向图,其中蓝色边的长度是…...
yocto 将kernel添加到rootfs
你的消息看起来又是一个搜索查询,关于如何在Yocto项目中将kernel添加到rootfs。根据我的搜索结果⁴,有两种方法可以实现这个目的:- 一种是在rootfs的bb文件中添加kernel-image和kernel-devicetree这两个软件包,这样就可以将内核镜…...
高通 Android10/12 4 6dof Camera+2RGBCamera异常处理经验总结
1 背景:此需求apk距离之前更改时间将近9个月,我们这边原来跟驱动那边对接指令和角度 后续没有改过,测试部说apk cameaid提示信息不正确。 2 原因:因为之前用的1.0基线(Android 10) 后面由于客户功能需求变更ÿ…...
项目实战典型案例17——环境混用来带的影响
环境混用来带的影响一:背景介绍背景出现的事故二:思路&方案环境混用的危害如何彻底避免环境混用的问题四:总结五:升华一:背景介绍 本篇博客是对对项目开发中出现的环境混用来带的影响进行的总结并进行的改进。目的…...
Linux【进程理解】
文章目录Linux【进程理解】一、冯诺依曼体系结构二、操作系统OS1.深入理解操作系统2.深入理解系统调用和库函数四、 进程(一)描述进程-PCB(二)组织进程和查看进程(三)通过系统调用创建进程-fork初识&#x…...
从GPS模块到地图显示:手把手教你用Python解析NMEA-0183协议数据
从GPS模块到地图显示:Python实战NMEA-0183协议解析全流程 当你第一次将GPS模块连接到电脑,看到串口终端不断刷新的$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47这类神秘代码时,是否感到无从下手?本文将带你…...
构建智能增量更新插件:Softer-Delta算法与工程实践
1. 项目概述与核心价值最近在折腾一些自动化工作流,发现很多场景下,我们都需要一个能“聪明”地处理文件差异、生成补丁,并且能无缝集成到现有工具链里的插件。这让我想起了之前用过的一个叫pear-plugin的工具,它挂在Softer-delta…...
ThinkPad风扇控制终极指南:如何让你的笔记本在静音与散热之间找到完美平衡
ThinkPad风扇控制终极指南:如何让你的笔记本在静音与散热之间找到完美平衡 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾经在深夜工作时…...
企业微信多账号协同管理方案:矩阵如何统一管理?
账号越来越多、运营越来越乱?通过企业微信 API,实现多账号统一管理与自动化调度。很多私域团队在业务增长后,都会开始运营多个企业微信账号。 但账号一多,人工切换、消息管理、客户分配都会变得非常混乱。QiWe 开放平台通过标准化…...
缠论自动化分析终极指南:ChanlunX让复杂技术分析变得简单
缠论自动化分析终极指南:ChanlunX让复杂技术分析变得简单 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的K线图感到迷茫?是否想要掌握缠论分析却苦于手工绘制…...
KV缓存优化与RAG系统性能提升实践
1. KV缓存技术原理与RAG系统挑战 在大型语言模型(LLM)推理过程中,KV(Key-Value)缓存技术通过存储注意力机制计算产生的中间状态来避免重复计算。具体来说,Transformer架构中的每个解码器层都会为输入序列生成键(Key)和值(Value)矩…...
百度网盘Mac版SVIP破解终极指南:解锁70倍下载速度的完整方案
百度网盘Mac版SVIP破解终极指南:解锁70倍下载速度的完整方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 百度网盘Mac版SVIP破解插件是一…...
避坑指南:为什么你的PyTorch 1.8 + CUDA 10.1跑不了Grad-CAM?深入torch.fx模块依赖
避坑指南:为什么你的PyTorch 1.8 CUDA 10.1跑不了Grad-CAM?深入torch.fx模块依赖 当你兴致勃勃地准备用Grad-CAM可视化模型注意力时,终端突然抛出ModuleNotFoundError: No module named torch.fx——这个看似简单的报错背后,其实…...
Arm Neoverse CMN-650信号接口架构与设计解析
1. Arm Neoverse CMN-650信号接口架构解析在现代SoC设计中,一致性互连网络如同城市交通系统,负责协调各个功能区块的数据流动。Arm Neoverse CMN-650作为第五代一致性网状网络IP,其信号接口设计体现了高性能计算对带宽、延迟和可靠性的极致追…...
终极免费音频编辑神器:告别昂贵软件,开启专业音频创作之旅
终极免费音频编辑神器:告别昂贵软件,开启专业音频创作之旅 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 你是否曾因音频编辑软件的复杂界面而望而却步?是否在寻找一款既能满足…...
