Java SPI与 Dubbo SPI的不同

Java SPI与 Dubbo SPI(扩展机制)的不同

一、什么是SPI扩展机制?

故名思意,对程序的扩展,使用SPI不需要任何配置文件,只要按照SPI规范在工程目录的MATE-INF.service下建立以扩展点接口名称作为文件名称,这样的话jar提供的可扩展服务能力就可以在文件中以列表的形式给出,第三方调用jar包扩展点能力的时候就可以根据需要获取实现类。

二、JAVA SPI

1.*** 简述:*** java.util包下提供了ServiceLoader,使用load方法就可以拿到扩展点列表,以 mysql 和 oracle driver为例,如下图所示:
请添加图片描述

  1. 代码实现:
public class JAVA_SPI {
    public static void main(String[] args) {
        // 1.拿到接口实现对象
        ServiceLoader<Driver> load = ServiceLoader.load(Driver.class);
        // 2.拿到集合
        Iterator<Driver> iterator = load.iterator();
        while (iterator.hasNext()){
            Driver next = iterator.next();
            System.out.println(next.toString());
        }
    }
}
  1. ***总结:***这样就能拿到所有实现了Driver接口的实现类,然后根据具体业务需求,自由选择使用mysql或者orcle了,可以发现在使用发不需要任何配置,扩展能力由服务提供方指定,服务能力的使用由调用方决定。
  2. JAVA SPI的缺点:SPI配置文件中配置多少实现类,JVM就会实例化多少实现类放入内容中,产生内存空间的占用

三、Dubbo SPI

  1. dubbo spi的使用了弥补了java spi的缺点,在使用扩展点的时候可以只实例化指定的实现类,并不会把所有的实现类都实现
    请添加图片描述3. 代码:
public class DUBBO_SPI {
    public static void main(String[] args) {
        ExtensionLoader<Protocol> extensionLoader = ExtensionLoader.getExtensionLoader(Protocol.class);
        Driver driver = extensionLoader.getExtension("mysql");
        System.out.println(protocol);
    }
}
  1. 源码解析:
public T getExtension(String name) {
        if (StringUtils.isEmpty(name)) {
            throw new IllegalArgumentException("Extension name == null");
        }
        // 获取默认扩展类
        if ("true".equals(name)) {
            return getDefaultExtension();
        }

        final Holder<Object> holder = getOrCreateHolder(name);
        Object instance = holder.get();

        // 如果有两个线程同时来获取同一个name的扩展点对象,那只会有一个线程会进行创建
        if (instance == null) {
            synchronized (holder) {
                instance = holder.get();
                if (instance == null) {
                    // 创建扩展点实例对象
                    instance = createExtension(name);   // 创建扩展点对象
                    holder.set(instance);
                }
            }
        }
        return (T) instance;
    }

通过功能分析,dubbo spi在使用上更加合理。

如果我写得文章对你有帮助,希望能关注下,后续会更新云原生、更多分布式框架源码解析,助力技术成长,终极目标是P8能力的养成。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值