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
目录
相关文章
|
SQL Java 数据库连接
SpringBoot2.x系列教程31--SpringBoot整合H2内存数据库实现CRUD操作
前言 在上一章节中,我给大家详细讲解了H2数据库的安装配置,接下来我就带大家在Spring Boot中整合H2数据库,实现代码操作。 一. 以内嵌模式整合H2数据库 1. 创建Web项目 我们按照之前的经验,创建一个SpringBoot的Web程序,具体过程略,请参考下图创建。 2. 添加依赖包 然后在pom.xml文件中添加如下依赖包。 <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <de
1598 1
SpringBoot2.x系列教程31--SpringBoot整合H2内存数据库实现CRUD操作
|
内存技术
Mac nvm 切换为淘宝镜像
Mac nvm 切换为淘宝镜像
1130 0
|
消息中间件 JavaScript 小程序
SpringBoot 使用线程池如何控制主线程和子线程的事务
SpringBoot 使用线程池如何控制主线程和子线程的事务
|
6月前
|
弹性计算 大数据 测试技术
2024年新版阿里云服务器价格表整理汇总,阿里云服务器收费报价详情
随着云计算技术的日益成熟,阿里云作为国内领先的云服务提供商,不断推出适应市场需求的云服务器产品。今天,我们就来详细解析一下阿里云新版云服务器的收费价格,帮助大家更好地选择适合自己的云服务器。2024年阿里云服务器租用价格表更新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服务器30元3个月,幻兽帕鲁4核16G和8核32G服务器配置,云服务器ECS可以选择经济型e实例、通用算力u1实
|
前端开发 Java 数据库连接
Spring框架源码分析之Spring核心思想讲解
Spring框架源码分析之Spring核心思想讲解
87 0
Spring框架源码分析之Spring核心思想讲解
|
运维 程序员 数据安全/隐私保护
24小时稳定性爆肝测试!国内外5款远程控制软件大盘点
24小时稳定性爆肝测试!国内外5款远程控制软件大盘点
24小时稳定性爆肝测试!国内外5款远程控制软件大盘点
|
JavaScript Windows 内存技术
使用nvm管理node.js版本以及错误处理
本文分享了如何使用nvm管理node版本及报错处理
3806 1
使用nvm管理node.js版本以及错误处理
|
缓存 Java Maven
从停用Maven,拥抱Gradle开始,学习SpringBoot
从停用Maven,拥抱Gradle开始,学习SpringBoot
271 0
从停用Maven,拥抱Gradle开始,学习SpringBoot
|
前端开发 JavaScript Java
SpringBoot源码分析系列之二:启动原理分析
我们都知道SpringBoot是目前微服务比较流行的技术选型,它可以将工程打成war包的方式在tomcat进行启动,也可以打成jar包,直接对外提供服务。那我们就会好奇,它是怎么去启动服务的,同时是怎么去加载前端页面、js文件、配置文件以及class文件等等然后向外提供web服务的。带着一系列的疑问,一步步探究SpringBoot的启动原理。 SpringBoot大致启动流程 源码跟踪分析 总结
SpringBoot源码分析系列之二:启动原理分析
|
Java 关系型数据库 MySQL
在 Spring Boot 中使用 HikariCP 连接池
在 Spring Boot 中使用 HikariCP 连接池
355 0
在 Spring Boot 中使用 HikariCP 连接池