一、概述
最早看到 SPI 这个机制是在 dubbo 实现 中,最近发现原来也不是什么新东西,竟然就是 JDK 中内置的玩意,今天就来一探究竟,看看它到底是什么玩意!
SPI的全称是 Service Provider Interface,它是一种服务发现机制,它通过在 classPath 路径下的 META-INF/services 文件夹查找服务实现,自动加载文件里所定义的接口实现类。
二、实现
首先,我们定义了一个接口 HelloService.java 和它的两个实现类 HelloServiceImplA.java、HelloServiceImplB.java
public interface HelloService { void hello(); }
public class HelloServiceImplA implements HelloService { @Override public void hello() { System.out.println("Hello! I am ImplA"); } }
public class HelloServiceImplB implements HelloService { @Override public void hello() { System.out.println("Hello! I am ImplB"); } }
接着,我们需要在 META-INF/services 下新建文件,文件名为接口全类名,文件内容即接口实现类全类名(多个实现类换行表示)。
最后,就是我们服务发现过程了,需要借助 ServiceLoader 类。
public class HelloServiceTest { public static void main(String[] args) { ServiceLoader<HelloService> serviceLoader = ServiceLoader.load(HelloService.class); Iterator<HelloService> iterator = serviceLoader.iterator(); while (iterator.hasNext()) { HelloService helloService = iterator.next(); helloService.hello(); } } }
三、总结
各位看官觉得如何?这种不用在程序中声明接口实现,又能够发起调用的方式,是不是让人觉得耳目一新!
SPI 的底层实现基本使用了反射机制,通过全类名实例化接口实现,从而发起调用。
SPI 机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。
参考博文:
来源:https://www.cnblogs.com/jmcui/p/12363239.html