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 ...
随机推荐
- win10下sublime text3 使用view in browser的快捷鍵添加方式
key-binding-user,于是,我在那里输入: [ { "keys": ["ctrl+b"], "command": " ...
- Java动态代理机制研读
java动态加载类(反射机制) /*MyClass.java*/ public class MyClass { public int id; public String name; public in ...
- odoo视图继承
odoo视图继承 简介继承 在odoo里可以通过继承的方式来改写已经存在的view 对比view的定义视图定义中写法多了inherit_id inherit_id指向要改写的view <fiel ...
- 循序渐进学.Net Core Web Api开发系列【15】:应用安全
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍W ...
- Codeforces.666A.Reberland Linguistics(DP)
题目链接 \(Description\) 给定串s,其由一个基本串后加任意多个长度为2或3的后缀串构成,要求基本串长度>4且相邻后缀串不相同.在基本串任意确定的情况下,求所有可能的后缀串. \( ...
- UVALive 6913 I Want That Cake 博弈dp
I Want That Cake 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemi ...
- CentOS 7搭建KVM在线管理面板WebVirtMgr之使用SSH授权登录
环境:CentOS 7.4 1.创建SSH私钥和ssh配置选项(在安装了WebVirtMgr的系统上): # 切换到nginx用户su - nginx -s /bin/bash # 生产ssh密钥 s ...
- HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4818 深深地补一个坑~~~ 现场赛坑在这题了,TAT.... 今天把代码改了下,过掉了,TAT 很明显 ...
- Golang Vendor 包管理工具 glide 使用教程
Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...
- Delph 两个对立程序使用消息进行控制通信
在实际应用中,总是会遇到两个独立的程序进行通信,其实通信的方式有好几种,比如进程间通信,消息通信. 项目中用到了此功能, 此功能用于锁屏程序, 下面把实现的流程和大家分享一下. 1. 在锁屏程序中,自 ...