Java SPI 实例

SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。

这里简单写一个例子示意

创建DemoService接口 如下

 1 package com.demo;
 2 
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public interface DemoService {
 8 
 9     void sayHello();
10 
11 }

创建两个实现类如下

Demo1Service
 1 package com.demo;
 2 
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public class Demo1Service implements DemoService {
 8 
 9     @Override
10     public void sayHello() {
11         System.out.println("hello  I am Demo1Service");
12     }
13 }

 

Demo2Service

 1 package com.demo;
 2 
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public class Demo2Service implements DemoService {
 8 
 9     @Override
10     public void sayHello() {
11         System.out.println("hello  I am Demo2Service");
12     }
13 }

 

java SPI 读取 META-INF/services/{接口名} 此目录 创建com.demo.DemoService文件,写上实现类 如下

1 com.demo.Demo1Service
2 com.demo.Demo2Service

 

创建测试类Main方法调用

 1 package com.demo;
 2 
 3 import java.util.ServiceLoader;
 4 
 5 /**
 6  * @author chaixg
 7  * 2019/1/25
 8  */
 9 public class Demo {
10 
11     public static void main(String[] args) {
12 
13         ServiceLoader.load(DemoService.class).forEach(DemoService::sayHello);
14     }
15 }

执行结果如下

 

 在文件中写上哪些实现类 这里就会获取到哪些实现类的实例 

我们就可以利用JDK提供的这一功能特性来做到动态给接口替换实现类 dubbo框架就利用了这一特性作为框架基础 不过Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。有兴趣者可以查看dubbo的实现

 

over...

 

posted @ 2019-01-25 14:02  柴柴1226  阅读(491)  评论(0编辑  收藏  举报