文档章节

Java SPI机制简介

李白吃白菜
 李白吃白菜
发布于 2016/04/14 15:03
字数 652
阅读 459
收藏 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机制

一、Java SPI机制 SPI(Service Provider Interface)是JDK内置的服务发现机制,用在不同模块间通过接口调用服务,避免对具体服务服务接口具体实现类的耦合。比如JDBC的数据库驱动模块,不同...

osc_jo6rqvdg
2018/04/18
2
0
java_SPI机制

简介 使用 创建一个接口: 创建两个实现类: 然后在src/main/resources/目录下创建子目录META-INF/services.创建一个以接口全限定名com.xll.spi.TestSpiService为文件名的文件。内容就是具体的...

grace_233
2018/11/20
15
0
高级开发必须理解的Java中SPI机制

本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。 1 SPI是什么 SPI全称Service Provider Interface,是Java提供的一套用来被...

onedotdot
03/19
9
0
Java SPI机制和使用示例

JAVA SPI 简介 SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface。根据 Java 的 SPI 规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即服务提供者...

osc_z7xhzbll
04/01
4
0
深入理解 Java 中 SPI 机制

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/vpy5DJ-hhn0iOyp747oL5A 作者:姜柱 SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,本文由...

vivo互联网技术
2019/09/09
82
0

没有更多内容

加载失败,请刷新页面

加载更多

Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
36分钟前
4
0
如何在Django视图中合并两个或多个查询集? - How to combine two or more querysets in a Django view?

问题: I am trying to build the search for a Django site I am building, and in that search, I am searching in 3 different models. 我正在尝试搜索要构建的Django网站,在该搜索中,我......

javail
42分钟前
5
0
PHP解析/语法错误; 以及如何解决它们? - PHP parse/syntax errors; and how to solve them?

问题: Everyone runs into syntax errors. 每个人都遇到语法错误。 Even experienced programmers make typos. 即使是经验丰富的程序员也会打错字。 For newcomers, it's just part of the......

fyin1314
今天
20
0
OSChina 周三乱弹 —— 公主是大王的,命是自己的。小怪也要养家糊口啊!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :郭燕的单曲《下半生》 最近听一些轻快的歌 #今日歌曲推荐# 《下半生》 - 郭燕 手机党少年们想听歌,请使劲儿戳(这里) @锦年 :...

小小编辑
今天
38
0
263. Ugly Number

题目: 263. Ugly Number 题目地址:https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers......

JiaMing
今天
68
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部