Dubbo的SPI机制

Dubbo的SPI机制

chuxiwen 2,911 2023-03-02

Dubbo的SPI机制

java的SPI

SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。

举个例子

项目结构
dubbo_spi_1
测试类代码和com.liu.Person文本内容
dubbo_spi_2
测试结果
dubbo_spi_3

如何运行

从文件中解析出数据,使用反射对对象进行创建,初始化等操作。

  • ServiceLoader类中有一个HashMap

dubbo_spi_4

  • 读取文件后,在jvm虚拟机中加载类对象

dubbo_spi_6

  • 将对象进行实例化,然后存入HashMap中

dubbo_spi_5

java spi 的不足之处

如图所示:
dubbo_spi_7

该接口会加载文件下所有的类,不能进行选择,按需取值,所以对此,Dubbo借鉴java Spi 的理念,进行拓展和完善。

Dubbo 的 SPI

用法

  • 根据选择的名字获取不同的对象

dubbo_spi_8

  • 动态代理,AOP功能

dubbo_spi_9

  • 依赖注入,自动注入

dubbo_spi_10

源码

大致流程

  • 根据传入的参数,获取相应的对象,如果传入true就创建默认的对象,如果cachedInstances中没有创建的对象,就创建该对象。
    dubbo_spi_11

  • 对实例进行创建,进入 createExtension(name,wrap) 方法
    dubbo_spi_12

  • 进入对class进行加载,进入getExtensionClasses()方法
    dubbo_spi_13

  • 如果缓存中没有,就扫描文件夹,对符合定义的文件进行类加载,存到缓存Map中。
    dubbo_spi_14

依赖注入的执行函数

反射获取set方法,对实例进行字段注入。
dubbo_spi_15


# dubbo学习