Java SPI机制
2016-04-14 15:23
627 查看
SPI 简介
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。
简单示例
通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。
最终的目录以及结构如下图所示
........................................................
接下来我们看代码
1:首先定义接口和实现类
2:META-INF文件下的HelloService,需要注意的是文件名为该类的路径+类名
3:test文件下的测试代码
最后的输出:
总之,为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。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文件里指定实现类的方式来暴露驱动提供者。
个人主页:http://www.whereta.com
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文件里指定实现类的方式来暴露驱动提供者。
个人主页:http://www.whereta.com
相关文章推荐
- 页面生成带有合计的表格
- Struts2---标签
- Maven---入门
- 线程-001-线程简介
- 深度理解spring的IOC
- SpringMVC中拦截器的使用
- java要整理的一些知识
- JAVA基础(24) web.xml配置详解二
- java毕向东听课笔记13(线程2)
- Maven项目中,编译proto文件成Java类
- Java中的BoneCP数据库连接池用法
- 项目开发环境搭建手记(2.Jdk安装——替代原有的OpenJDK)
- (java)求最长回文子串
- 谈谈对Spring IOC的理解
- spring原理 struts2原理 hibernate原理 MyBatis原理 SpringMVC
- Java中的PushbackReader流理解
- WebService及搭建Java版WebService
- 将字符串中的每一个字母变成其下一个字母
- java Reflection(反射)机制
- java实现Base64编码解码