面试常问的dubbo的spi机制到底是什么?(上)(一)

pivoteic
发布于 2022-6-16 17:45
浏览
0收藏

 

前言

一、什么是spi机制?

二、java的spi机制 -- ServiceLoader

三、spring的spi机制 -- SpringFactoriesLoader 

四、dubbo的spi机制 -- ExtensionLoader 源码剖析

总结

 

前言

dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力。作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在国内活跃起来,dubbo也越来越深受各大公司的青睐。本文就来对dubbo的spi机制源码进行剖析,看一看dubbo的spi到底有哪些特性和功能。

 

一、什么是spi机制?

 

SPI (Service Provider Interface),主要用于扩展的作用。举个例子来说,假如有一个框架有一个接口,他有自己默认的实现类,但是在代码运行的过程中,你不想用他的实现类或者想扩展一下他的实现类的功能,但是此时你又不能修改别人的源码,那么此时该怎么办?这时spi机制就有了用武之地。一般框架的作者在设计这种接口的时候不会直接去new这个接口的实现类,而是在Classpath路径底下将这个接口的实现类按作者约定的格式写在一个配置文件上,然后在运行的过程中通过java提供的api,从所有jar包中读取所有的这个指定文件中的内容,获取到实现类,用这个实现类,这样,如果你想自己替换原有的框架的实现,你就可以按照作者规定的方式配置实现,这样就能使用你自己写的实现类了。

 

spi机制其实体现了设计思想中的解耦思想,方便开发者对框架功能进行扩展。

 

二、java的spi机制 -- ServiceLoader

 

java中最常见的spi机制应用就是数据库驱动的加载,java其实就是定义了java语言跟数据库交互的接口,但是具体的实现得交给各大数据库厂商来实现,那么java怎么知道你的数据库厂商的实现了?这时就需要spi机制了,java好约了定在 Classpath 路径下的 META-INF/services/ 目录里创建一个以服务接口命名的文件,然后内容是该数据库厂商的实现的接口的全限定名,这样数据库厂商只要按照这个规则去配置,java就能找到。

 

我以mysql来举例,看一下mysql是怎么实现的。

面试常问的dubbo的spi机制到底是什么?(上)(一)-鸿蒙开发者社区

    内容

面试常问的dubbo的spi机制到底是什么?(上)(一)-鸿蒙开发者社区

java是通过ServiceLoader类来实现读取配置文件中的实现类的。大家有兴趣可以看一下里面的代码,其实就是读取到每个jar包底下的文件,读取里面的内容。

 

三、spring中的spi机制 -- SpringFactoriesLoader

 

相信spring大家都不陌生,在spring扩展也是依赖spi机制完成的,只不过spring对于扩展文件约定在Classpath 路径下的 META-INF目录底下,所有的文件名都是叫spring.factories,文件里的内容是一个以一个个键值对的方式存储的,键为类的全限定名,值也为类的全限定名,如果有多个值,可以用逗号分割,有一点得注意的是,键和值本身约定并没有类与类之间的依赖关系(当然也可以有,得看使用场景的约定),也就是说键值可以没有任何关联,键仅仅是一种标识,代表一种场景,最常见的自动装配的注解,@EnableAutoConfiguration,也就是代表自动装配的场景,当你需要你的类被自动装配,就可以以这个注解的权限定名键,你的类为名,这样springboot在进行自动装配的时候,就会拿这个键,找到你写的实现类来完成自动装配。

 

这里我贴出了自动装配时加载类的源码。

面试常问的dubbo的spi机制到底是什么?(上)(一)-鸿蒙开发者社区

这里其实就是通过@EnableAutoConfiguration的全限定名从spring.factories中加载这个键对应的所有的实现类的名称,这样就能拿到所有需要自动装配的类的全限定名了。

 

mybatis整合spring的自动装配功能文件

面试常问的dubbo的spi机制到底是什么?(上)(一)-鸿蒙开发者社区

内容

面试常问的dubbo的spi机制到底是什么?(上)(一)-鸿蒙开发者社区

mybatis也是按照spring的规则来配置的。大家有空可以去看MybatisAutoConfiguration这个实现类,里面有mybatis是如何跟spring整合的内容。

 

SpringFactoriesLoader的应用场景还有很多,大家可以去看一下SpringBoot中的启动引导类SpringApplication,里面多次使用到了这个SpringFactoriesLoader这个类来获取各种实现。

 

文章转自公众号:三友的java日记

标签
已于2022-6-16 17:45:30修改
收藏
回复
举报
回复
    相关推荐