Dubbo的SPI机制是啥啊?

在这里插入图片描述

前言

之前大致的把Dubbo的运作流程简单的分析了一遍了,Dubbo还有一个很大的优点,就是采用的微内核+SPI扩展设计

这又是什么呢,这个可以很好的支持一些有特殊需求的三方的接入,可以自定义扩展,自主定制二次开发,良好的扩展性对于框架来说是很重要的

在这里插入图片描述

简单了解下SPI,全称为 Service Provider Interface,是一种服务发现机制。

它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。

举个例子,比如你有个接口,现在这个接口有 3 个实现类,那么在系统运行的时候对这个接口到底选择哪个实现类呢?

这就需要SPI了,需要根据指定的配置或者是默认的配置,去找到对应的实现类加载进来,然后用这个实现类的实例对象。

Java中JDK自身实现了SPI机制,基于策略模式来实现动态加载的机制 。我们在程序只定义一个接口,具体的实现交个不同的服务提供者;在程序启动的时候,读取配置文件,由配置确定要调用哪一个实现

但是呢,存在一定的缺点,比如不能按照需要加载,会一次性加载所有可用的扩展点,很多是不需要的,会浪费系统资源;不支持AOP和依赖注入,实现类的方式也不够灵活,只能通过 Iterator 形式获取

你不够强,或者说你做的不符合我的需求,我就替换你

在这里插入图片描述

于是呢,dubbo重新实现了一套功能更强的 SPI 机制, 支持了AOP与依赖注入,并且 利用缓存提高加载实现类的性能,同时支持实现类的灵活获取

Java中的SPI

Java中JDK自身实现了SPI机制,基于策略模式来实现动态加载的机制 。我们在程序只定义一个接口,具体的实现交个不同的服务提供者;在程序启动的时候,读取配置文件,由配置确定要调用哪一个实现

首先,我们需要定义一个接口,SPIService


public interface SPIService {
   
    void execute();
}

然后,定义两个实现类,没别的意思,只输入一句话。


public class SpiImpl1 implements SPIService{
   
    public void execute() {
   
        System.out.println
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值