javaspi的理解(转载)

简介: 原文链接:http://www.tuicool.com/articles/rINr2mdemo代码:https://github.com/lebron374/javaspi_demon一、SPI机制这里先说下SPI的一个概念,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SPI就是Service提供者接口;我对SPI的定义:提供给服务提供厂商与扩展框架功能的开发者使用的接口。

原文链接:http://www.tuicool.com/articles/rINr2m

demo代码:https://github.com/lebron374/javaspi_demon


一、SPI机制

这里先说下SPI的一个概念,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SPI就是Service提供者接口;我对SPI的定义:提供给服务提供厂商与扩展框架功能的开发者使用的接口。

在我们日常开发的时候都是对问题进行抽象成Api然后就提供各种Api的实现,这些Api的实现都是封装与我们的Jar中或框架中的虽然当我们想要提供一种Api新实现时可以不修改原来代码只需实现该Api就可以提供Api的新实现,但我们还是生成新Jar或框架(虽然可以通过在代码里扫描某个目录已加载Api的新实现,但这不是Java的机制,只是hack方法),而通过Java SPI机制我们就可以在不修改Jar包或框架的时候为Api提供新实现。

很多框架都使用了java的SPI机制,如java.sql.Driver的SPI实现(mysql驱动、oracle驱动等)、common-logging的日志接口实现、dubbo的扩展实现等等框架;

SPI机制的约定:

1)         在META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为Api具体实现类的全限定名

2)         使用ServiceLoader类动态加载META-INF中的实现类

3)         如SPI的实现类为Jar则需要放在主程序classPath中

4)         Api具体实现类必须有一个不带参数的构造方法

img_21bdf7050b77e494ea7375e69012f73c.jpe

补充说明:META-INF/services/xxx,这个是必须的约定,也就是说spi的接口必须放在META-INF/services/目录中且新建的文件名为spi接口,文件中的内容为接口实现类,多个实现类换行即可

SPI机制结构图

二、SPI机制示例

img_6178dc0bd8cb5d45690b696cf6fb9d5f.png

实例结构图

IOperation接口:

/**

* Created by LX on 2015/3/8.

*/publicinterfaceIOperation{publicintoperation(intnumberA,intnumberB);}

PlusOperationImpl实现:

importco.solinx.demo.api.IOperation;/**

* Created by LX on 2015/3/8.

*/publicclassPlusOperationImplimplementsIOperation{@Overridepublicintoperation(intnumberA,intnumberB){returnnumberA + numberB;}}

SPI接口的实现类:DivisionOperationImpl

importco.solinx.demo.api.IOperation;/**

* Created by LX on 2015/3/8.

*/publicclassDivisionOperationImplimplementsIOperation{@Overridepublicintoperation(intnumberA,intnumberB){returnnumberA / numberB;}}

META-INF/Services目录中的文件:

文件名:co.solinx.demo.api.IOperation,内容:co.solinx.demo.spi.DivisionOperationImpl

img_5c45727fefcaf022ec903e843c423b0d.png

Main类:

importco.solinx.demo.api.IOperation;importco.solinx.demo.impl.PlusOperationImpl;importco.solinx.demo.spi.DivisionOperationImpl;importjava.util.Iterator;importjava.util.ServiceLoader;/**

* Created by LX on 2015/3/8.

*/publicclassmain{publicstaticvoid main(String[] args) {IOperationplus = newPlusOperationImpl();IOperationdivision = newDivisionOperationImpl();System.out.println(plus.operation(5,3));System.out.println(division.operation(9,3));ServiceLoader operations =ServiceLoader.load(IOperation.class);Iterator operationIterator = operations.iterator();System.out.println("classPath:"+System.getProperty("java.class.path"));while(operationIterator.hasNext()) {IOperationoperation = operationIterator.next();System.out.println(operation.operation(6,3));}    }}

运行结果:

img_e7ad62810c4b910d3456fc20d23998df.png
目录
相关文章
|
存储 安全 Ubuntu
群控软件代理,群控服务器配置要求
群控软件代理,群控服务器配置要求
442 8
|
人工智能 自然语言处理 机器人
探索人工智能:使用Python构建一个简单的聊天机器人
探索人工智能:使用Python构建一个简单的聊天机器人
527 0
|
存储 安全 编译器
|
7月前
|
存储 人工智能 数据可视化
如何实现电竞比赛的实时直播?
电竞直播如何实现丝滑体验?揭秘其背后架构与技术!从选手操作数据捕获到观众多视角体验,超低延迟编码、智能OB系统、全球加速网络等五大关键技术支撑。面对海量数据与同步挑战,采用列式存储、时间戳同步和区块链防作弊。未来还将迎来云游戏式直播、AR可视化等创新,甚至全息投影与AI集锦生成,为观众带来沉浸式享受。
如何实现电竞比赛的实时直播?
|
机器学习/深度学习 人工智能 程序员
大模型时代的思考:小心陷入ChatLLMs构建的蜜糖陷阱-基于人类反馈的间接(反向)驯化-你是否有注意到?
本文探讨了大模型基于人类反馈训练的原理及其潜在风险,特别是大模型在迎合用户需求时可能带来的“蜜糖陷阱”。通过实际案例分析,强调了理性使用大模型的重要性,提出了保持批判性思维、明确人机协作边界、提升人类判断力和创新能力等建议,旨在让大模型真正为人类服务,而不是限制人类思维。
327 4
|
存储 人工智能 自然语言处理
AI大模型助力客户对话分析
《AI大模型助力客户对话分析》解决方案通过自然语言处理技术(如情感分析、关键词提取、意图识别),帮助企业优化客户服务体验。方案详细介绍了大模型在对话分析中的应用,但技术细节和业务流程整合方面需进一步完善。部署体验清晰,但依赖安装和函数计算配置需补充说明。示例代码基本可用,但注释不足,且存在权限和超时问题。方案满足了核心业务需求,但在多语言支持、实时性和自定义模型优化等方面有改进空间。
|
图形学 开发者
透视与正交之外的奇妙视界:深入解析Unity游戏开发中的相机与视角控制艺术,探索打造沉浸式玩家体验的奥秘与技巧
【8月更文挑战第31天】在Unity中,相机不仅是玩家观察游戏世界的窗口,更是塑造氛围和引导注意力的关键工具。通过灵活运用相机系统,开发者能大幅提升游戏的艺术表现力和沉浸感。本文将探讨如何实现多种相机控制,包括第三人称跟随和第一人称视角,并提供实用代码示例。
642 1
|
存储 Java 网络安全
如何使用Python批量连接网络设备?
【7月更文挑战第4天】
347 1
如何使用Python批量连接网络设备?
|
存储 前端开发 JavaScript
深入Web前端:栈与堆的优缺点全解析,让你大开眼界!
【8月更文挑战第23天】本文以问答形式解析了Web前端开发中至关重要的内存管理概念——栈与堆。栈采用后进先出(LIFO)原则存储执行上下文,适用于函数调用管理;而堆则灵活存储如对象和数组等复杂数据类型。栈操作迅速但访问受限,堆则提供动态空间分配但可能牺牲内存效率。理解两者特性有助于提升JavaScript编程技巧。
270 1
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的律师事务所案件管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的律师事务所案件管理系统附带文章源码部署视频讲解等
363 11

热门文章

最新文章