Java SPI与 Dubbo SPI(扩展机制)的不同
一、什么是SPI扩展机制?
故名思意,对程序的扩展,使用SPI不需要任何配置文件,只要按照SPI规范在工程目录的MATE-INF.service下建立以扩展点接口名称作为文件名称,这样的话jar提供的可扩展服务能力就可以在文件中以列表的形式给出,第三方调用jar包扩展点能力的时候就可以根据需要获取实现类。
二、JAVA SPI
1.*** 简述:*** java.util包下提供了ServiceLoader,使用load方法就可以拿到扩展点列表,以 mysql 和 oracle driver为例,如下图所示:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL3lEVPRTUU10MNpHW3BjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2QTM3gzNiBTNwkjMkhzNhZ2NwQDOlVGMyUDOmZjN4YzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- 代码实现:
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());
}
}
}
- ***总结:***这样就能拿到所有实现了Driver接口的实现类,然后根据具体业务需求,自由选择使用mysql或者orcle了,可以发现在使用发不需要任何配置,扩展能力由服务提供方指定,服务能力的使用由调用方决定。
- JAVA SPI的缺点:SPI配置文件中配置多少实现类,JVM就会实例化多少实现类放入内容中,产生内存空间的占用
三、Dubbo SPI
- dubbo spi的使用了弥补了java spi的缺点,在使用扩展点的时候可以只实例化指定的实现类,并不会把所有的实现类都实现 3. 代码:
Java SPI与 Dubbo SPI的不同
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);
}
}
- 源码解析:
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能力的养成。