开篇
前面用了4 篇文章分析了 Dubbo SPI 的几种用法以及如何在 Dubbo 中应用的,
- Dubbo SPI 使用方法(一)- 扩展点自动包装
- Dubbo SPI 使用方法(二)- 扩展点自适应
- Dubbo SPI 使用方法(三)- 扩展点自动装配
- Dubbo 源码分析 - Dubbo SPI 在 Protocol 层 的应用
本文通过 Debug Dubbo2.7.x 源码的方法分析 如何通过 getExtension(name) 获取一个扩展对象实例 。
正文
回顾一下 Dubbo SPI 的最基本的用法
public class App
{
public static void main( String[] args )
{
// 第一步
ExtensionLoader<HelloService> extensionLoader = ExtensionLoader.getExtensionLoader(HelloService.class);
// 第二步
HelloService helloService = extensionLoader.getExtension("helloService");
// 第三步
helloService.sayHello("xiaoming");
}
}
我们直接从第二步 debug 进入getExtension(name)
方法
1. ExtensionLoader 的属性
在 debug 进入方法之前, 先来看几个 ExtensionLoader
的属性
// 1. 扩展接口, 比如 Protocol
private final Class<?> type;
// 2. 扩展实现类集合, key 为 Protocol , value 为 DubboProtocol
private static final ConcurrentMap<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<>();
// 3. (缓存的)扩展实现类集合
private final Holder<Map