JDK SPI 机制

2020-02-26 16:17:54 浏览数 (1)

一、概述

最早看到 SPI 这个机制是在 dubbo 实现 中,最近发现原来也不是什么新东西,竟然就是 JDK 中内置的玩意,今天就来一探究竟,看看它到底是什么玩意!

SPI的全称是 Service Provider Interface,它是一种服务发现机制,它通过在 classPath 路径下的 META-INF/services 文件夹查找服务实现,自动加载文件里所定义的接口实现类。

二、实现

首先,我们定义了一个接口 HelloService.java 和它的两个实现类 HelloServiceImplA.java、HelloServiceImplB.java

代码语言:javascript复制
public interface HelloService {

    void hello();
}
代码语言:javascript复制
public class HelloServiceImplA implements HelloService {
    
    @Override
    public void hello() {
        System.out.println("Hello! I am ImplA");
    }
}
代码语言:javascript复制
public class HelloServiceImplB implements HelloService {
    
    @Override
    public void hello() {
        System.out.println("Hello! I am ImplB");
    }
}

接着,我们需要在 META-INF/services 下新建文件,文件名为接口全类名,文件内容即接口实现类全类名(多个实现类换行表示)。

最后,就是我们服务发现过程了,需要借助 ServiceLoader 类。

代码语言:javascript复制
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机制。

0 人点赞