Java SPI机制简介

SPI 简介java

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

简单示例apache

经过一个简单例子来讲明SPI是如何使用的。 首先经过一张图来看看,用SPI须要遵循哪些规范,由于spi毕竟是JDK的一种标准。框架

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

 接下来咱们看代码模块化

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,须要注意的是文件名为该类的路径+类名spa

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文件里指定实现类的方式来暴露驱动提供者

相关文章
相关标签/搜索