Java SPI机制简介


SPI 简介

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,

而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可) 公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。

简单示例

通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。 "" 我们首先需要一个目录,META-INF\services 如下,最终的目录路径就像这样:

1
2 3 4 5 6 7 8 9 10 11 12 
└── src ├── com │   └── ivanzhang │   └── spi │   ├── HelloInterface.java │   ├── impl │   │   ├── ImageHello.java │   │   └── TextHello.java │   └── SPIMain.java └── META-INF  └── services  └── com.ivanzhang.spi.HelloInterface

文件名字为 接口/抽象类: 全名 文件内容: 接口/抽象类 实现类

就像这样: com.ivanzhang.spi.impl.TextHello com.ivanzhang.spi.impl.ImageHello

接下来, 我们需要定义接口和实现类:

1
2 3 
public interface HelloInterface {  public void sayHello(); }

实现类:

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 
public class TextHello implements HelloInterface {   @Override  public void sayHello() {  System.out.println("Text Hello.");  }  }  public class ImageHello implements HelloInterface {  @Override  public void sayHello() {  System.out.println("Image Hello");  } }

最后,来看看,如果使用SPI机制,客户端代码:

1
2 3 4 5 6 7 8 9 10 11 
public class SPIMain {  public static void main(String[] args) {   ServiceLoader<HelloInterface> loaders =  ServiceLoader.load(HelloInterface.class);   for (HelloInterface in : loaders) {  in.sayHello();  }  } }

最后的输出: Text Hello.Image Hello

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM