看到这么多扩展类(每一个配置文件中都有很多) , 我们首先应该思考一个问题:Dubbo一启动 , 就加载所有的扩展类么?作为一个优秀的RPC框架 , 肯定不会耗时耗力做这样的无用功 , 所以肯定会通过一种方式拿到指定的扩展才对 。 我们可以看到大多是以键值对方式(表示为extName-value)配置的扩展 , 那么不难猜测 , 这里的extName就是用来实现上面所说的功能的 。 那到底是不是呢?以上纯属猜测 , 下面就到源码中去验证 。
SPI源码Dubbo中实现SPI的核心类是ExtensionLoader , 该类并未提供公共的构造方法来初始化 , 而是通过getExtensionLoader方法获取一个loader对象:
// loader缓存private static final ConcurrentMap, ExtensionLoader>> EXTENSION_LOADERS = new ConcurrentHashMap, ExtensionLoader>>();public staticExtensionLoader getExtensionLoader(Class type) {if (type == null)throw new IllegalArgumentException("Extension type == null");if(!type.isInterface()) {throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");}if(!withExtensionAnnotation(type)) {throw new IllegalArgumentException("Extension type(" + type +") is not extension, because WITHOUT @" + SPI.class.getSimpleName() + " Annotation!");}ExtensionLoader loader = (ExtensionLoader) EXTENSION_LOADERS.get(type);if (loader == null) {EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader(type));loader = (ExtensionLoader) EXTENSION_LOADERS.get(type);}return loader;}private final ExtensionFactory objectFactory;private ExtensionLoader(Class> type) {this.type = type;objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());}这里的class参数就是扩展点的接口类型 , 每一个loader都需要绑定一个扩展点类型 。 然后首先从缓存中获取loader , 未获取到就初始化一个loader并放入缓存 。 而在私有构造器初始化的时候我们需要注意objectFactory这个变量 , 先大概有个映像 , 后面会用到 。 拿到loader之后 , 就可以调用getExtension方法去获取指定的扩展点了,该方法传入了一个name参数 , 不难猜测这个就是配置文件中的键 , 可以debugger验证一下:
private final ConcurrentMap> cachedInstances = new ConcurrentHashMap>();public T getExtension(String name) { if (name == null || name.length() == 0)throw new IllegalArgumentException("Extension name == null"); if ("true".equals(name)) {return getDefaultExtension(); } // 从缓存中获取Holder对象 , 该对象的值就是扩展对象 Holder同样的也是先从缓存拿 , 缓存没有就创建并添加到缓存 , 因此主要看createExtension方法:
// 扩展类实例缓存对象private static final ConcurrentMap, Object> EXTENSION_INSTANCES = new ConcurrentHashMap
推荐阅读
-
-
-
中国好声音|中国好声音:傅欣瑶不堪舆论压力,坦言只是一场戏,你们太认真了
-
数字|交行行长:人民币国际化2.0版必是注入数字元素的体系竞争
-
中国IDC圈:加速多元AI算力落地,浪潮与寒武纪签约
-
IT爱好者的圈子 智能”照明设备ABB”系统给人类催起了极大的节能控制
-
-
converse 官网的鞋是真的么 匡威官网定制网址
-
鞠婧祎|《花戎》首播差评如潮,网友差评的理由出奇的一致!
-
新片区成立一周年,上海移动“新基建”“双千兆”成绩亮眼
-
「二叠纪」南京专家最新研究发现: 大灭绝后湖泊生态系统复苏需要一千万年
-
总是担心自己工作出错,害怕因为自己的原因造成损失,单位要我赔偿,很痛苦,咋办
-
-
【科技日报】2020年成都新生大熊猫幼仔国庆前亮相
-
极致|中国水彩:大笔触画出霸屏水彩,光感够绝,极致东方的美!
-
『做饭小七七』南瓜此种做法,营养又美味,学会此做法,一顿2斤南瓜不够吃
-
营业顺丰:8月速运物流业务营收111.57亿元 同比增长28.3%
-
男生考北大骑马戴红花返乡|男生考北大骑马戴红花返乡 读书改变命运!
-
高通三大运营商纷纷力挺,高通受损紧急转变态度,华为5G最后底牌亮出
-
乐园园讲八卦|蔡少芬:这是我18,王祖贤:对不起请让让,朱茵:这是我18岁