天天看点

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为例,如下图所示:

Java SPI与 Dubbo SPI的不同
  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的缺点,在使用扩展点的时候可以只实例化指定的实现类,并不会把所有的实现类都实现
    Java SPI与 Dubbo 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能力的养成。