Dubbo SPI

in with 0 comment

1. 简介

SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并有服务加载器读取配置文件,加载实现类。这样可以再运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 和 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。

2. SPI 示例

2.1 Java SPI 示例

前面简单介绍了 SPI 机制的原理,本节通过一个示例演示 Java SPI 的使用方法。首先,我们定义一个借口,名称为 Robot。

public interface Robot {
	void sayHello();
}

接下来定义两个实现类,分别为 OptimusPrime 和 Bumbelbee。

public class OptimusPrime implements Robot {
	
	@Override
	public void sayHello() {
		System.out.println("Hello, I am Optimus Prime.");
	}
}

public class Bumbelee implements Robot {
	
	@Override
	public void sayHello() {
		System.out.println("Hello, I am Bumbelee.");
	}
}

接下来 META-INF/services 文件夹下创建一个文件,名称为 Robot 的全限定名 org.apache.spi.Robot。文件内容为实现类的全限定的类名,如下:

org.apache.spi.OptimusPrime
org.apache.spi.Bumbelee

做好所需的准备工作,接下里编写代码进行测试。

public class JavaSPITest {
	
	@Test
	public void sayHello() throus Exception {
		ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class);
		System.out.println("Java SPI");
		serviceLoader.forEach(Robot::sayHello);
	}
}

最后看一下测试结果,如下:

测试结果

2.2 Dubbo SPI 示例