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...
原文地址:https://www.cnblogs.com/jasonChai/p/10319292.html
时间: 2024-11-05 21:53:54