当前位置:网站首页>@Extension、@SPI注解原理
@Extension、@SPI注解原理
2022-07-05 18:12:00 【小小少年_】
在dubbo源码中,涉及到一些dubbo自定义的注解,这篇笔记主要记录这些注解的原理和使用方式,了解了这些之后,便于我们对dubbo进行二次扩展
@SPI
dubbo的SPI机制,和Java原生的SPI机制相比,新增了name,可以指定某一个实现类对应的name,我们在使用的时候,可以根据name,获取自己想要使用的扩展类,如果在获取实现类时,指定name为true,默认返回的是@spi注解中指定的name对应的实现类
简单来说:@SPI注解中指定的value值,是当前接口默认的实现类,比如,下面的这个截图,就表示Protocol的默认实现类是DubboProtocol
这个在哪里可以体现呢?
com.alibaba.dubbo.common.extension.ExtensionLoader#loadExtensionClasses
在这个方法中,是加在指定文件目录下的文件的,其中会先根据type,获取到对应的@SPI注解,这里的type,就是对应的接口;所以,这里可以看到,会把@SPI注解中value对应的key,设置为CacheDefaultName这个变量中
com.alibaba.dubbo.common.extension.ExtensionLoader#getExtension
在这个方法中,是根据入参中的name,找到对应的实现类,比如:当前type是protocol,如果入参了dubbo,那就是要找key是dubbo的protocol实现类,通常是dubboProtocol
这里会看到,如果如此那的name是true,表示要获取的是默认的实现类
这里会看到,就是从CacheDefaultName中获取的
public T getDefaultExtension() {
getExtensionClasses();
if (null == cachedDefaultName || cachedDefaultName.length() == 0
|| "true".equals(cachedDefaultName)) {
return null;
}
return getExtension(cachedDefaultName);
}
所以:@SPI注解,是加在接口上,表示该接口的默认实现类,在获取的时候,如果入参的name是true,会取默认的实现类
@Extension
通常在使用dubbo的SPI机制时,我们需要自己在文件中使用key = 全类名;这种格式来配置name;但是假如我们没有在文件中指定,那可以使用@Extension注解,加在实现类上,并指定key(这里的key就等同于文件中等号前面的key),因为在dubbo源码中,在解析文件的时候,如果没有指定name,会解析实现类是否有添加@Extension
这里需要注意的是:这个注解和@SPI注解两者之间,我认为是没有太大关系的,因为@SPI注解的value,是我们在指定name为true的时候,才会和@SPI注解有关系
而@Extension注解是key的一种设置方式
com.alibaba.dubbo.common.extension.ExtensionLoader#loadClass
在这个方法中,有一段代码
这个方法的上下文,简单介绍下,在dubbo源码中,会一次性加在type对应的所有实现类,会根据实现类,来区分,当前实现类是包装类?还是自适应扩展类?还是普通的实现类,如果是普通的实现,就会执行截图中的这个方法,在执行时,如果我们没有在文件中指定key = 实现类,那此时会判断实现类(这里的clazz已经是实现类了,因为dubbo会根据文件中的全类名,生成一个clazz)上是否有添加@Extension注解
private String findAnnotationName(Class<?> clazz) {
com.alibaba.dubbo.common.Extension extension = clazz.getAnnotation(com.alibaba.dubbo.common.Extension.class);
if (extension == null) {
String name = clazz.getSimpleName();
if (name.endsWith(type.getSimpleName())) {
name = name.substring(0, name.length() - type.getSimpleName().length());
}
return name.toLowerCase();
}
return extension.value();
}
所以,@Extension注解的含义是:如果我们在文件中,没有给实现类指定key,那就会去判断实现类是否有使用@Extension注解,有,就会使用注解对应的value来作为key
边栏推荐
- Nacos distributed transactions Seata * * install JDK on Linux, mysql5.7 start Nacos configure ideal call interface coordination (nanny level detail tutorial)
- pytorch yolov5 训练自定义数据
- Le cours d'apprentissage de la machine 2022 de l'équipe Wunda arrive.
- Sophon CE社区版上线,免费Get轻量易用、高效智能的数据分析工具
- VC编程入门浅谈「建议收藏」
- 使用QT遍历Json文档及搜索子对象
- GFS distributed file system
- 最大人工岛[如何让一个连通分量的所有节点都记录总节点数?+给连通分量编号]
- 爱因斯坦求和einsum
- 如何获取飞机穿过雷达两端的坐标
猜你喜欢

Sophon kg upgrade 3.1: break down barriers between data and liberate enterprise productivity

FCN: Fully Convolutional Networks for Semantic Segmentation

nacos -分布式事务-Seata** linux安装jdk ,mysql5.7启动nacos配置ideal 调用接口配合 (保姆级细节教程)

Sophon AutoCV:助力AI工业化生产,实现视觉智能感知

隐私计算助力数据的安全流通与共享

ISPRS2020/云检测:Transferring deep learning models for cloud detection between Landsat-8 and Proba-V

Sophon Base 3.1 推出MLOps功能,为企业AI能力运营插上翅膀

Redis Foundation

Failed to virtualize table with JMeter

ConvMAE(2022-05)
随机推荐
爱因斯坦求和einsum
Whether to take a duplicate subset with duplicate elements [how to take a subset? How to remove duplicates?]
Sophon CE社区版上线,免费Get轻量易用、高效智能的数据分析工具
Daily exercise: a series of dates
jdbc读大量数据导致内存溢出
Find the first k small element select_ k
Sophon AutoCV:助力AI工业化生产,实现视觉智能感知
Fix vulnerability - mysql, ES
Wu Enda team 2022 machine learning course, coming
星环科技数据安全管理平台 Defensor重磅发布
ISPRS2020/云检测:Transferring deep learning models for cloud detection between Landsat-8 and Proba-V
图扑软件数字孪生 | 基于 BIM 技术的可视化管理系统
matlab内建函数怎么不同颜色,matlab分段函数不同颜色绘图
buuctf-pwn write-ups (9)
Isprs2022 / Cloud Detection: Cloud Detection with Boundary nets Boundary Networks Based Cloud Detection
EasyCVR平台通过接口编辑通道出现报错“ID不能为空”,是什么原因?
Leetcode exercise - 206 Reverse linked list
LeetCode笔记:Weekly Contest 300
华夏基金:基金行业数字化转型实践成果分享
English sentence pattern reference