Java的SPI和Dubbo的SPI比较

141 阅读1分钟
  1. Java的SPI机制

demo

测试类
public class JavaSPITest {
    public static void main(String[] args) {
        //创建服务加载器,只能加载所有实现类,不能加载指定实现类,不能做到按需加载
        ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class);
        System.out.println("Java SPI");
        //创建实现类的实例
        serviceLoader.forEach(Robot::say);
    }
}

//接口
public interface Robot {
    void say();
}

//实现类
public class Bumblebee implements Robot{
    @Override
    public void say() {
        System.out.println("hello i am Bumblebee");
    }
}

//实现类
public class OpyimusPrime implements Robot{
    @Override
    public void say() {
        System.out.println("hello i am OpyimusPrime");
    }
}

总结

    1.  只能加载所有实现类,不能加载指定实现类,不能做到按需加载
    2.  创建的配置文件目录src/main/resources/META-INF/services
    3.  配置文件名为接口的全类名org.roy.spi.Robot
    4.  配置文件每一行都是一个实现类的全类名


  1. dubbo的SPI机制

demo

测试类
public static void testDubboSPI(){
    ExtensionLoader<Robot> extensionLoader = ExtensionLoader.getExtensionLoader(Robot.class);
    Robot opyimusPrime = extensionLoader.getExtension("opyimusPrime");
    opyimusPrime.say();

    Robot bumblebee = extensionLoader.getExtension("bumblebee");
    bumblebee.say();

}

总结

    1. 好多东西都是约定好的,配置文件的目录是src/main/resources/META-INF/dubbo
    2. 配置文件的文件名还是接口的全类名
    3. 配置文件是key=value的形式
    4. 接口上一定要有注解@SPI