文档章节

Java SPI机制简介

李白吃白菜
 李白吃白菜
发布于 2016/04/14 15:03
字数 652
阅读 381
收藏 5

SPI 简介

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。

简单示例

通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。

最终的目录以及结构如下图所示
........................................................

 接下来我们看代码

1:首先定义接口和实现类

 /**
 * @author xyxsoft@126.com
 */
public interface HelloService {
 
 void sayHello();
}
public class JavaHello implements HelloService{
     public void sayHello() {
      System.out.println("hello:Java");
     }
}
public class DubboHello implements HelloService{
     public void sayHello() {
      System.out.println("hello:Dubbo");
     }
}

 2:META-INF文件下的HelloService,需要注意的是文件名为该类的路径+类名

com.xyxsoft.spi.service.impl.JavaHello
com.xyxsoft.spi.service.impl.DubboHello

3:test文件下的测试代码

 
public class SPIMain {
 
 public static void main(String[] args) {
  ServiceLoader<HelloService> loaders = 
               ServiceLoader.load(HelloService.class);
         for (HelloService in : loaders) {
             in.sayHello();
         }
 }
}

最后的输出:

hello:Java
hello:Dubbo

 总之,为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。

其实好多例子都是采用这种模式,比如:1.common-logging和2.jdbc

common-logging,apache最早提供的日志的门面接口。只有接口,没有实现。具体方案由各提供商实现,发现日志提供商是通过扫描 META-INF/services/org.apache.commons.logging.LogFactory配置文件,通过读取该文件的内容找到日志提工商实现类。只要我们的日志实现里包含了这个文件,并在文件里制定 LogFactory工厂接口的实现类即可。

jdbc4.0以前,开发还需要基于Class.forName("xxx")的方式来装载驱动,jdbc4也基于spi的机制来发现驱动提供商了,可以通过META-INF/services/java.sql.Driver文件里指定实现类的方式来暴露驱动提供者


© 著作权归作者所有

共有 人打赏支持
李白吃白菜
粉丝 12
博文 33
码字总数 18863
作品 0
朝阳
私信 提问
Java SPI - Service Provider Interface

Java SPI_Service Provider Interface 最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制。所以简单的总结下java spi机制的思想。 我们系统里抽象...

秋风醉了
2015/12/29
0
0
Java类加载器ClassLoader

JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。 2.显式装载, 通过class.forname()等方法,显式加载需要的...

兴国First
10/14
0
0
JDK源码之ClassLoader

Java类加载器ClassLoader总结 JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。 2.显式装载, 通过class.for...

村长大神
2014/03/27
0
0
聊聊Dubbo - Dubbo可扩展机制实战

1. Dubbo的扩展机制 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 如同罗马不是一天建成的,任何系统都一定是从小系统不...

中间件小哥
05/29
0
0
聊聊Dubbo - Dubbo可扩展机制实战

摘要: 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 1. Dubbo的扩展机制 在Dubbo的官网上,Dubbo描述自己是一个高性能...

阿里云云栖社区
06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

颜色模型与颜色应用---光的特性

电磁频谱 颜色的心理学特征

中国龙-扬科
19分钟前
2
0
android音频及强噪相关

Android AudioRecord和AudioTrack介绍(Android音频收集和播放 麦克风降噪) https://blog.csdn.net/tanningzhong/article/details/72844559 音频采集(AudioRecorder) https://www.jianshu.......

whoisliang
26分钟前
2
0
redis-持久化

RDB rdb持久化是把当前进程数据生成快照保存到磁盘的过程。触发RDB持久化过程分为手动触发和自动触发。 触发机制 bgsave执行流程 rdb优缺点 AOF 记录每次写命令,重启时再重新执行aof文件中的...

grace_233
31分钟前
3
0
电话激活Windows 中文操作系统步骤

已购买微软MAK批量授权,系统又在企业内网中,无法通过连接Internet进行激活,还可以通过电话完成激活。 前期准备 请提前准备好产品密钥,Product Key格式如下:XXXXX-XXXXX-XXXXX-XXXXX-XXX...

tonyfox
33分钟前
4
0
Apache用户认证,域名跳转,访问日志

Apache用户认证 当设置了用户认证后,用户访问网站时,需要输入用户名和密码才能访问。 可以全局设置,也可以为某几个虚拟主机单独配置。 下面以全局配置进行操作示例。 编辑httpd.conf进行配...

野雪球
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部