@Extension、@SPI注解原理

阿里一面:说一说Java、Spring、Dubbo三者SPI机制的原理和区别 SPI全称为Service Provider Interface,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。通过以上分析可以看出,实现SPI机制的核心原理就是通过IO流读取指定文件的内容,然后解析,最后加入一些自己的特性。 阅读详情

在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

【Dubbo的那些SPI接口】 Dubbo中有 @SPI @Adaptive @Activate 三个跟SPI相关的注解@SPI标记这是一个SPI接口@Adaptive作用在SPI接口的成员方法,调用SPI接口方法时根据这个方法的入参字段来决定使用哪个SPI接口实现类@Activate自动激活的实现类。 阅读详情

相关推荐

【Siddhi 5】Siddhi 自定义函数@Extension使用

1.概述 先看看博客, 【Siddhi】Siddhi 5 自定义函数简单使用,然后我看官网有个@Extension想知道@Extension有什么作用,于是我测试了一下,加这个的时候不需要注册就能使用如下 函数如下 package org.apache.flink.streaming.siddhi.exception; import io.siddhi.annotation.Example; import io.siddhi.annotation.Extension; import io.siddhi..

九师兄 1164

dubbo之SPI扩展机制注解:@Extension注解的作用

在接口的实现类上可以使用该注解,如果该实现类在扩展文件中,没有配置name,就可以通过@Extension注解,指定name

小小少年的博客 1404

道闸不自动落杆故障排查:从传感器原理到控制器调试全解析

在工业自动化和物联网系统中,传感器与控制器构成的闭环控制是保障设备可靠运行的核心。其基本原理是通过传感器采集环境状态,控制器依据预设逻辑做出决策并驱动执行器动作。这一技术价值在于实现了无人值守下的安全、高效自动化,广泛应用于智能交通、安防和智能楼宇等领域。以停车场道闸系统为例,其自动落杆功能高度依赖地感线圈与防砸雷达的协同。地感线圈作为触发单元,负责感知车辆接近;而防砸雷达则作为持续监测的安全单元,通过微波探测防砸区域内是否有障碍物,其信号是控制器执行落杆决策的关键依据。当系统出现车辆通过后闸杆不落的典型故

weixin_29190651的博客 312

dubbo SPI之@SPI、@Adaptive注解, 以及什么时候动态生成$Adaptive代码

本文基于dubbo2.7.7对如下三个问题分析 1. ``@SPI``注解的作用;2. ``@Adaptive``注解的作用,放在Type和Method上的区别和注意点;3. 什么时候动态生成和编译``xxx$Adaptive``代码

Brucelwl的博客 1214

C++新手也能搞定!Windows下Cesium-Native编译全流程(附依赖下载技巧)

本文为C++新手详细介绍了在Windows系统下编译Cesium-Native库的全流程。重点针对网络环境不佳的情况,提供了手动下载依赖库的实用技巧,并指导用户使用CMake配置、生成解决方案,最终完成编译与测试验证,帮助开发者成功构建这一处理3D地理空间数据的C++运行时库。

weixin_28839549的博客 381

Qt Creator菜单栏消失的终极修复指南:从快捷键冲突到设置恢复

本文详细解析了Qt Creator菜单栏消失的常见原因及修复方法,包括快捷键冲突排查、配置文件重置和界面模式切换等解决方案。特别针对Qt开发者遇到的菜单栏显示问题,提供了从简单快捷键操作到深度配置修改的全方位指南,帮助用户快速恢复Qt Creator的正常使用。

weixin_27240351的博客 338

Dubbo-SPI(二)-@SPI注解

Dubbo-SPI系列文章目录 Dubbo-SPI(一)-加载机制概述 Dubbo-SPI(二)-@SPI注解 Dubbo-SPI(五)-@Activate注解 文章目录Dubbo-SPI系列文章目录@SPI@Extension @SPI 主要作用是 标记使用这个注解的接口 是 一个 Dubbo SPI接口,即 是一个 扩展点,可以有多个 不同的 内置 或 用户定义的实现 通过value属性,可以传入不同的参数 来设置 接口的 默认实现类 @Documented // 注解不仅被保存到class文件中

星光之子的博客 546

从配置字到实际运动:手把手教你用EtherCAT调试伺服电机的控制模式(以倍福TwinCAT3为例)

本文详细介绍了如何使用EtherCAT调试伺服电机的控制模式,以倍福TwinCAT3为例。从环境搭建、模式配置到状态机切换,提供了完整的操作指南和典型故障排查方法,帮助工程师快速解决‘配置字写入了但电机不转’等常见问题,提升工业自动化现场的调试效率。

weixin_42783709的博客 421

Dubbo源码学习(九) 详解Dubbo里的SPI

SPI是中间件设计不可缺少的一项,SPI能提高应用的可插拔性,SPI的英文全称: Service Provider Implementation, 我们可以在META-INF目录里配置SPI, ServiceLoader会根据配置来找到接口的实现,那Dubbo里的@SPI又是什么呢?Dubbo的Common模块里,定义了一个@SPI注解,该注解在extension包里,作用是标记一个接口为可扩展性的接口,具体的用法在下文里演示,被@SPI标记的接口默认的作用范围ExtensionScope是应用级别的。

Dream_it_possible!的博客 1624

华为CCA架构软件栈VehicleStack解析:3层服务化设计与AOS/VOS双核OS

本文深入解析华为CCA架构下的VehicleStack软件平台,重点介绍其三层服务化设计(硬件抽象层、服务框架层、应用层)与AOS/VOS双核操作系统协同机制。该架构通过计算与通信的深度融合,推动汽车电子电气架构向集中式发展,为智能汽车提供灵活、高效的软件定义汽车解决方案。

weixin_33491377的博客 324

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2670

【dubbo源码解析】 --- dubbo spi 机制(@SPI、@Adaptive)详解

本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录1 @SPI 标签 及其使用简介 上篇文章《【SPI】 — java spi 机制简介》中, 可以看到,java spi 机制非常简单, 就是读取指定的配置文件, 将所有的类都加载到程序中。 而这种机制, 存在很多缺陷, 比如: 所有实现类无论是否使用, 直接被加载, 可能存在浪费 不能够灵活控制什么时候什么时机, 匹配什么实现, 功能太弱 Dubbo 基于自己的需要,对SPI 机制进.

nrsc 1742

手把手实现STM32+ESP8266+原子云服务器+手机APP应用——第一节-ATK-ESP8266 WIFI模块通过USB-TTL实现连接原子云服务器与手机APP互相通信

本节实现ATK-ESP8266 WIFI模块通过USB-TTL实现连接原子云服务器与手机APP通信。具体来说,本节使用串口CH340(USB-TTL)连接正点原子ATK-ESP8266 WIFI模块,通过AT命令实现连接原子云服务器与手机APP互相通信,实现硬件设备(WIFI模块)与云服务器和手机APP的互相通信。后面章节不用串口CH340(USB-TTL),通过编写单片机程序实现数据远程互相通信,并介绍手机APP的程序设计。单片机任意款即可,STM32F1系列,F4系列,H系列等都可以。本系列为(手把手实

嵌入式阿齐Archie 8420

JAVA基础:SPI是什么

1.什么是SPI SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。SPI的作用就是为这些被扩展的API寻找服务实现。 2.SPI和API的使用场景 API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。从使用人员上来说,API 直接被应用开发人员使用。 ...

SeanSunnn 960

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

类扩展(extension)

扩展(Extension) 扩展文件的创建 第一步.新建文件  第二步.选择iOS平台Source中的Object-C Fie  第三步.选择File Type为Extension,则可建立相应类的扩展文件 第四步.扩展文件为"单一"的.h文件  第五步.命名为”类名+类别名.h” #import "类名.h" @interface 类名 () // 在此添加私有成员变量、属性、声明方...

大牛的专栏 662

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

详细分析Java中的@ExtendWith注解(附Demo)

在Java中,@ExtendWith注解通常与JUnit 5一起使用,用于扩展JUnit测试框架

码农研究僧的博客 2257

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

extension(类扩展)和 category(类别)

extension(类扩展) 1、进行一个类扩展

swel的博客 6586

一步步解析Dubbo之@SPI机制

(个人理解,如果有误,望请指正,谢谢) 首先@SPI机制的功能类是ExtensionLoader.这是一个泛型,这个类中有两部分构成,一部分是静态变量,一部分是实例变量。 静态变量中主要有两个CurrentHashMap, 一个用来存已经实例化的ExtensionLoarder,一个则用来存放具体类型的实例 接下来,我们来看下实例变量部分: 有一个class type,和ExtensionFac...

longjiang900517的博客 5680

dubbo SPI使用:@SPI 与 @Adaptive

dubbo中使用spi除了配置文件外还需要有@SPI和@Adaptive注解,这两个注解中都可以设置参数,且@Adaptive注解可以设置在方法上也可以设置在类上。下面我们来卡一下他的具体使用规则。 1、引入dubbo依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.x</v

zhoushimiao1990的博客 1091

Dubbo源码学习--SPI实现@SPI和@Adaptive

上一篇博客 Dubbo入门学习--Dubbo服务提供接口SPI机制我们已经简单介绍了Dubbo的SPI机制,这篇博客我们来剖析一下Dubbo是如何使用SPI机制的,在接口中使用@SPI("值")使用默认的实现类,如果我们不想使用默认的实现类是如何处理的。1、获取指定实现类在ExtensionLoader中获取默认实现类或者通过实现类名称来获取实现类。Protocol refprotocol = E...

井底之蛙 9903

java spi使用详解

一篇文章带你详细了解java中SPI的详细使用

congge 5932

Java 使用 Lombok 的 @ExtensionMethod 注解实现向现有的类添加新的方法

我学习 Flutter 时发现 Dart 从2.7版本开始引入了扩展方法(Extension Methods)。扩展方法允许我们向现有的类添加新的方法,而无需修改原类或创建子类,这对于增强系统库类特别有用。当时我就想 Java 能否实现这种功能,后面也没想到自己实现的策略,直到今天我发现了Lombok的@ExtensionMethod注解!狂喜!Lombok是一个流行的Java库,通过减少样板代码来简化代码编写。其中一个强大的功能就是注解,它可以增强代码的可读性和简洁性。在本教程中,我们将深入探讨。

訾博(ZiBo)的博客 780

Apache Dubbo的@SPI接口应用

记录:472 场景:使用Apache Dubbo的@SPI接口加载实现类搭建框架。 版本:JDK 1.8,dubbo-common-3.0.0。

zhangbeizhen18的博客 556

ExtendWith注解

步骤 1:实现扩展类System . out . printf("测试 %s 执行耗时: %d ms%n" , context . getDisplayName() , duration);} }System . out . printf("测试 %s 执行耗时: %d ms%n" , context . getDisplayName() , duration);} }

weixin_43476824的博客 861

sass之extend

首先我们从一段代码开始入手。如下 $cicc-red: red; @mixin setRadius($radius) { -webkit-border-radius: $radius; -moz-border-radius: $radius; border-radius: $radius; } %btn-display { display: bl

yxcbluesky的专栏 496
上一篇: AopContext对象原理
下一篇: mysql联合索引的使用
小小少年_
博客等级 码龄10年 63粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值