Java SPI(Service Provider Interface)简介
SPI 简介
SPI 全称为(Service Provider Interface),是JDK内置的一种服务提供发现机制。
一个服务(Service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按照SPI 标准存放到资源路径(resources)META-INF/services目录下,文件的命名为该服务接口的全限定名。如有一个服务接口:
package com.winner.spi; /**
* @author winner_0715
* @date 2018/4/1
*/
public interface DemoService {
String sayHello(String name);
}
其服务实现类为:
package com.winner.spi.impl; import com.winner.spi.DemoService; /**
* @author winner_0715
* @date 2018/4/1
*/
public class DemoServiceImpl implements DemoService { @Override
public String sayHello(String name) {
return "hello , " + name;
}
}
那此时需要在META-INF/services中创建一个名为com.ricky.codelab.spi.DemoService的文件,其中的内容就为该实现类的全限定名:com.ricky.codelab.spi.impl.DemoServiceImpl。
如果该Service有多个服务实现,则每一行写一个服务实现(#后面的内容为注释),并且该文件只能够是以UTF-8编码。
然后,我们可以通过ServiceLoader.load(Class class); 来动态加载Service的实现类了。
许多开发框架都使用了Java的SPI机制,如java.sql.Driver的SPI实现(mysql驱动、oracle驱动等)、common-logging的日志接口实现、dubbo的扩展实现等等。
SPI机制的约定
- 在META-INF/services/目录中创建以Service接口全限定名命名的文件,该文件内容为Service接口具体实现类的全限定名,文件编码必须为UTF-8。
- 使用ServiceLoader.load(Class class); 动态加载Service接口的实现类。
- 如SPI的实现类为jar,则需要将其放在当前程序的classpath下。
- Service的具体实现类必须有一个不带参数的构造方法。
1、项目结构
2、Service接口定义
package com.winner.spi; /**
* @author winner_0715
* @date 2018/4/1
*/
public interface DemoService {
String sayHello(String name);
}
3、Service接口实现类
本示例中DemoService有两个实现类,分别为:EnglishDemoServiceImpl和ChineseDemoServiceImpl,代码如下:
EnglishDemoServiceImpl.java
package com.winner.spi.impl; import com.winner.spi.DemoService; /**
* @author winner_0715
* @date 2018/4/1
*/
public class EnglishDemoServiceImpl implements DemoService { @Override
public String sayHello(String name) {
return "hello , " + name;
}
}
ChineseDemoServiceImpl.java
package com.winner.spi.impl; import com.winner.spi.DemoService; /**
* @author winner_0715
* @date 2018/4/1
*/
public class ChineseDemoServiceImpl implements DemoService { @Override
public String sayHello(String name) {
return "你好 , " + name;
}
}
META-INF/services/配置
在src/main/resources 下创建META-INF/services/目录,并新建com.winner.spi.DemoService文件,内容如下:
#English implementation
com.winner.spi.impl.EnglishDemoServiceImpl
#Chinese implementation
com.winner.spi.impl.ChineseDemoServiceImpl
加载Service实现类
import com.winner.spi.DemoService; import java.util.Iterator;
import java.util.ServiceLoader; /**
* @author winner_0715
* @date 2018/4/1
*/
public class Test {
public static void main(String[] args) {
ServiceLoader<DemoService> serviceLoader = ServiceLoader.load(DemoService.class);
Iterator<DemoService> it = serviceLoader.iterator();
while (it.hasNext()) {
DemoService demoService = it.next();
System.out.println("class:" + demoService.getClass().getName()
+ "-->" + demoService.sayHello("World"));
}
}
}
执行结果:
import com.winner.spi.DemoService; import java.util.Iterator;
import java.util.ServiceLoader; /**
* @author winner_0715
* @date 2018/4/1
*/
public class Test {
public static void main(String[] args) {
ServiceLoader<DemoService> serviceLoader = ServiceLoader.load(DemoService.class);
Iterator<DemoService> it = serviceLoader.iterator();
while (it.hasNext()) {
DemoService demoService = it.next();
System.out.println("class:" + demoService.getClass().getName()
+ "-->" + demoService.sayHello("World"));
}
}
}
Java SPI(Service Provider Interface)简介的更多相关文章
- JAVA SPI(Service Provider Interface)原理、设计及源码解析(其一)
背景 团队内部轮流技术分享,其他人都是分享源码,我每次都是设计和架构,感觉自己太特立独行.这次我要合群点,分享点源码. 概念 Service Provider Interface:服务提供方接口.是一 ...
- Java SPI(Service Provider Interface)
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个 ...
- java的spi(Service Provider Interface)机制及源码(java8)
1.什么是java的spi spi 全称为 service provider interface 即 服务提供接口,用来作为服务的扩展发现.在运行时动态添加接口的实现,是对接口的实现类的创建管理. 2 ...
- SPI: Service Provider Interface
Service Provider Interface: JDK提供的一种服务发现的机制:主要是用于厂商实现JDK的只用. 比如说打印机,JDK提供了一个驱动接口com.printl.printerDr ...
- Java中的SPI(Service Provider Interface)
转自:http://singleant.iteye.com/blog/1497259 最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结 ...
- SPI(Service Provider Interface)机制
JAVA SPI 约定如下:当服务的提供者提供了服务接口的一种实现之后,在jar包的META-INF/services/ 目录中同时创建一个以服务接口命名的文件,该文件中的内容就是实现该服务接口的具体 ...
- SPI(Service Provider Interface)--通过接口获取服务
spi 现在已有实现 jdk 提供实现 dubbo里的spi实现 一.jdk实现 配置 定义接口 定义实现类 配置资源文件 classpath下创建(META-INF/services/接口全面:ME ...
- Service Provider Interface
@(Java)[SPI] Service Provider Interface API的一种设计方法,一般用于一些服务提供给第三方实现或者扩展,可以增强框架的扩展或者替换一些组件. 结构 Servic ...
- 【Java实战】源码解析Java SPI(Service Provider Interface )机制原理
一.背景知识 在阅读开源框架源码时,发现许多框架都支持SPI(Service Provider Interface ),前面有篇文章JDBC对Driver的加载时应用了SPI,参考[Hibernate ...
随机推荐
- 查询物理表字段(mysql)
SELECT t.COLUMN_NAME AS NAME, ( CASE WHEN t.IS_NULLABLE = 'YES' THEN '1' ELSE '0' END ) AS ISNULL, ( ...
- Linux环境Tomcat运行报错java.lang.OutOfMemoryError
java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "http-bio-8080-ex ...
- 【翻译】What is State Machine Diagram(什么是状态机图)?
[翻译]What is State Machine Diagram(什么是状态机图)? 写在前面 在上一篇学习类图的时候将这个网站上的类图的一篇文章翻译了出来,感觉受益良多,今天来学习UML状态机图, ...
- 5969 [AK]刻录光盘
题目描述 Description • 在FJOI2010夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会一时 ...
- BZOJ4242 : 水壶
对于任意两个建筑物,以它们之间的最短路为边权求出最小生成树. 则询问(x,y)的答案为最小生成树上x到y路径上边权的最大值. BFS求出离每个点最近的建筑物以及到它的距离,可以发现只有交界处的边才有用 ...
- Linux shell 脚本小记2
.从文件读取 while read line do echo "line=$line" done < file.txt .将字符串转换为数组,并进行遍历 str=" ...
- Codeforces Round #258 (Div. 2) . Sort the Array 贪心
B. Sort the Array 题目连接: http://codeforces.com/contest/451/problem/B Description Being a programmer, ...
- linux_远程copy
1:远程copy [linux对linux 远程拷贝] scp 文件名 root@远程ip:/路径/ 将本地home目录下的test.tar的文件拷贝到远程主机192.168.1.23的/ho ...
- Timer-triggered memory-to-memory DMA transfer demonstrator
http://www.efton.sk/STM32/bt.c // Timer-triggered memory-to-memory DMA transfer demonstrator for STM ...
- bitnami redmine配置全过程
常见问题: 我在自己的机器上面配置完毕以后,移植到另外一台机器上面,登陆页面总是在检查network,并且最后网络加载失败,不论我是用桥接还是NAT方式连接.登陆系统以后,我尝试连接网络失败,尝试执行 ...