Java SPI机制
2016-04-28 10:21
232 查看
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文件里指定实现类的方式来暴露驱动提供者。
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。
简单示例
通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。
最终的目录以及结构如下图所示
........................................................
接下来我们看代码
1:首先定义接口和实现类
?
?
?
?
其实好多例子都是采用这种模式,比如: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文件里指定实现类的方式来暴露驱动提供者。
相关文章推荐
- java synchronized详解
- Java中实现文件上传下载的三种解决方案
- spring配置文件详解
- java语言实现号码归属地查询
- JAVA窗口程序之入门
- java中通过反射获取方法并且调用(getMethod和invoke深入)实践
- XAMPP和javaweb的数据库的连接中文查询数据不成功的问题
- 第83课:Scala和Java二种方式实战Spark Streaming开发
- java内存泄露分析
- Java异常处理(3)自动关闭的try
- ZeroMQ(java)之Router/Dealer模式
- Dwr3.0纯注解(纯Java Code配置)配置与应用浅析一之零配置文件化
- 关于 Spring new出来的对象 与自动注入对象
- Java中几种日志方案
- 应用开发工程依赖Jar包系列(一)--Spring框架
- Java如何停止线程
- java开源框架SpringSide 3.1.4.3开发Web的demo项目实战
- spring 技术内幕--IOC初始化之BeanDefinition的在IOC容器中的注册
- ajax请求springmvc与mvc:annotation-driven
- LoadRunner中Java Vuser协议脚本开发