3.1 dubbo SPI ServiceLoader

java ServiceLoader

一个加载接口实现的加载器。针对接口的不同实现,全部加载进jvm。这种实现必定有一个公共接口存在,是java 自身提供的第三方扩展实现,使服务暴露和服务实现解耦,典型的应用就是mysql数据库的的驱动实现。

  • eg:公共接口=》animal 接口 实现类=》dog 实现类,cat 实现类。

公共接口

package com.test.ice;

/**
 *
 * 动物类接口
 *
 * @author zby
 * @time 2021/4/23 16:28
 * ****************************************
 */
public interface Animal {
    /**
     *
     * @desc 动物叫
     ******************************************
     */
    public void jiao();
}

狗的实现

package com.test.iceimpl;

import com.test.ice.Animal;
/**
 * 
 * 狗的实现
 * 
 * @author zby
 * @time 2021/4/25 10:49
 * ****************************************
 */
public class Dog implements Animal {
    @Override
    public void jiao() {
        System.out.println("狗叫声");
    }
}

猫的实现

package com.test.iceimpl;

import com.test.ice.Animal;
/**
 *
 * 猫的实现
 *
 * @author zby
 * @time 2021/4/25 10:49
 * ****************************************
 */
public class Cat implements Animal {
    @Override
    public void jiao() {
        System.out.println("猫叫声");
    }
}

最终加载接口实现进jvm

package com.test;

import com.test.ice.Animal;

import java.util.ServiceLoader;
/**
 *
 * serviceloader main
 *
 * @author zby
 * @time 2021/4/25 10:52
 * ****************************************
 */
public class TestServiceLoader {
    public static void main(String[] argus){
        ServiceLoader<Animal> serviceLoader = ServiceLoader.load(Animal.class);
        for (Animal v : serviceLoader) {
            v.jiao();
        }
    }
}

执行结果:
执行结果:

java ServiceLoader到现在就介绍完了,下面详细阐述dubbo 源码中ServiceLoader的使用。
dubbo在版本2.7.7之前都是使用硬编码的形式去发现META-INF/dubbo.internal文件夹下面的适配类。

version 2.7.6之前load实现类

在这里插入图片描述

version 2.7.7之后load实现类

// 定义加载策略

// 从resource下面加载出需要的位置
在这里插入图片描述

// uml图,Priortized实现接口比较排序
在这里插入图片描述

以上就是dubbo2.7.7 替换的serviceloader的使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值