Dubbo源码解析(二)

一、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 的配置文件夹路径:

配置文件内容:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值