一、SPI机制原理
一、Java SPI 机制
SPI 全称Service Provider Interface,是Java 提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。

可以看到,SPI 的本质,其实是帮助程序,为某个特定的接口寻找它的实现类。而且哪些实现类的会加载,是个动态过程(不是提前预定好的)。有点类似IOC 的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以SPI 的核心思想就是解耦。
比较常见的例子:
1、数据库驱动加载接口实现类的加载、JDBC 加载不同类型数据库的驱动
2、日志门面接口实现类加载、SLF4J 加载不同提供商的日志实现类
3、Spring 中大量使用了SPI,比如:对servlet3.0 规范对ServletContainerInitializer 的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等
一、使用介绍
要使用Java SPI,需要遵循如下约定:
1、当服务提供者提供了接口的一种具体实现后,在jar 包的META-INF/services 目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;
2、接口实现类所在的jar包放在主程序的classpath 中;
3、主程序通过java.util.ServiceLoder 动态装载实现模块,它通过扫描META-INF/services 目录下的配置文件找到实现类的全限定名,把类加载到JVM;
4、SPI 的实现类必须携带一个不带参数的构造方法;
先定义一个接口

再定义一系列它的实现

第二个实现


测试,程序运行时可以发现只加载了配置文件指定的实现类


二、核心功能类
需要指出的是,java 之所以能够顺利根据配置加载这个实现类,完全依赖于jdk 内的一个核心类:
ServiceLoader

二、Dubbo SPI 机制
在上一节中,可以看到,java spi 机制非常简单,就是读取指定的配置文件,将所有的类都加载到程序中。而这种机制,存在很多缺陷,比如:
1. 所有实现类无论是否使用,直接被加载,可能存在浪费
2. 不能够灵活控制什么时候什么时机,匹配什么实现,功能太弱。Dubbo 基于自己的需要,增强了这套SPI 机制,下面介绍Dubbo 中的SPI用法。
一、标签@SPI 用法
与Java SPI 实现类配置不同,Dubbo SPI 是通过键值对的方式进行配置,这样我们就可以按需加载指定的实现类。另外,需要在接口上标注@SPI 注解。表明此接口是SPI 的扩展点:

dubbo 的配置文件夹路径:

配置文件内容:

最低0.47元/天 解锁文章
3842

被折叠的 条评论
为什么被折叠?



