> wrappers = cachedWrapperClasses;if (wrappers == null) {cachedWrapperClasses = new ConcurrentHashSet>();wrappers = cachedWrapperClasses;}wrappers.add(clazz);} catch (NoSuchMethodException e) {// 进入此分支表示为一个普通的扩展类clazz.getConstructor();if (name == null || name.length() == 0) {// 由于历史原因 , Dubbo最开始配置文件中并不是以K-V来配置的// 扩展点 , 而是会通过@Extension注解指定 , 所以这里会通过// 该注解去获取到namename = findAnnotationName(clazz);// 由于@Extension废弃使用 , 但配置文件中仍存在非K-V的配置 ,// 所以这里是直接通过类名获取简单的nameif (name == null || name.length() == 0) {if (clazz.getSimpleName().length() > type.getSimpleName().length()} else {throw new IllegalStateException("No such extension name for the class " + clazz.getName() + " in the config " + url);}}}String[] names = NAME_SEPARATOR.split(name);if (names != nullif (activate != null) {cachedActivates.put(names[0], activate);}for (String n : names) {if (! cachedNames.containsKey(clazz)) {cachedNames.put(clazz, n);}Class> c = extensionClasses.get(n);if (c == null) {extensionClasses.put(n, clazz);} else if (c != clazz) {throw new IllegalStateException("Duplicate extension " + type.getName() + " name " + n + " on " + c.getName() + " and " + clazz.getName());}}}}}}至此 , 我们就看到了Dubbo SPI的实现全过程 , 我们也了解了Dubbo强大的扩展性是如何实现的 , 但是这么多扩展 , Dubbo在运行中是如何决定调用哪一个扩展点的方法呢?这就是Dubbo另一强大的机制:自适应扩展 。 (PS:这里需要留意cachedAdaptiveClass和cachedWrapperClasses两个变量的赋值 , 后面会用到 。 )
二、自适应扩展机制什么是自适应扩展?上文刚刚也说了 , Dubbo中存在很多的扩展类 , 这些扩展类不可能一开始就全部初始化 , 那样非常的耗费资源 , 所以我们应该在使用到该类的时候再进行初始化 , 也就是懒加载 。 但是这是比较矛盾的 , 拓展未被加载 , 那么拓展方法就无法被调用(静态方法除外) 。 拓展方法未被调用 , 拓展就无法被加载(官网原话) 。 所以也就有了自适应扩展机制 , 那么这个原理是怎样的呢?首先需要了解@Adaptive注解 , 该注解可以标注在类和方法上:
- 标注在类上 , 表明该类为自定义的适配类
- 标注在方法上 , 表明需要动态的为该方法创建适配类
当有地方调用扩展类的方法时 , 首先会调用适配类的方法 , 然后适配类再根据扩展名称调用getExtension方法拿到对应的扩展类对象 , 最后调用该对象的方法即可 。 流程就这么简单 , 下面看看代码怎么实现的 。 首先我们回到ExtensionLoader的构造方法中:
objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
其中调用了getAdaptiveExtension方法 , 从方法名不难看出就是去获取一个适配类对象:
private final Holder
推荐阅读
-
挖贝网|预计合计减持不超总股本2.54%,安井食品2名股东拟减持股份
-
-
卡哇伊|财神找上门,横财大发800万的生肖,9月12号13号14号15号运势上上签
-
大连13岁男孩杀害10岁女孩案宣判|大连13岁男孩杀害10岁女孩案宣判 媒体:未成年人犯罪应受足够审思
-
红得快,凉得更快的7位明星,以前是男神女神,如今“无人问津”
-
北晚新视觉网夸自己,骂奥巴马,特朗普母亲节狂发上百条推特
-
-
青年|魔兽世界怀旧服:第5阶段最需要自然抗性的职业是谁?
-
手机大魔王■ODM厂商业务全面铺开:搭乘5G开始1+8+n模式
-
-
珠光宝气|下一个“幸运儿”又会是谁?,各大平台之间的大剧版权争抢不断
-
北京警方查获一名隐瞒湖北居住史从第三地进京违法人员
-
-
【网信北京】成都宣判一起20人涉黑案 主犯被判25年
-
央视新闻客户端|北美观察丨宣扬“新冠骗局论” 美右翼媒体被指坑害受众
-
-
沙尘半月内两袭北方今后会成“常客”?听听专家们怎么说
-
邓超@邓超送花安慰孙俪上热搜:“三无”的婚姻千篇一律,有趣的婚姻万里挑一
-
90后薅羊毛获利45万被批捕!网友却吵翻......
-
涛咪电竞▲2秒回3千血,狂暴后羿瞬间不香了,张大仙“抽血流”东方镜问世