当前位置: 首页 > news >正文

@AliasFor 使用

@AliasFor 使用

@AliasFor 它允许开发者为一个注解的属性指定别名。通过使用@AliasFor,我们可以提供多个名称来引用同一属性,从而增加了代码的灵活性和可读性

定义一个注解

package com.example.demo.aspect;import org.springframework.core.annotation.AliasFor;import java.lang.annotation.*;/*** 蔡定努* 2024/06/06 13:25*/
@Documented
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CR {@AliasFor("name")String key() default "";@AliasFor("key")String name() default "";}

使用

@PostMapping("two")@CR(name = "可看出")public void two(@RequestBody Product product) {System.out.println(0);}

定义一个切面


package com.example.demo.aspect;import cn.hutool.core.annotation.AnnotationUtil;
import com.cdn.cretry.anno.CRetry;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;/*** @author 蔡定努* 2024/06/01 23:21*/
@Component
@Aspect
@Slf4j
public class CRetryAspect {@Before(value = "@annotation(c)")public void checkCRAnnotation(JoinPoint joinPoint, CR c) throws Throwable {MethodSignature ms = (MethodSignature) joinPoint.getSignature();Method method = ms.getMethod();CR cRetry = method.getAnnotation(CR.class);System.out.println("这是method.getAnnotation输出的值"+cRetry);CR annotation = AnnotationUtils.getAnnotation(method, CR.class);System.out.println("这是AnnotationUtils输出的值"+annotation);}
}

输出:

这是method.getAnnotation输出的值@com.example.demo.aspect.CR(name=可看出, key=)
这是AnnotationUtils输出的值@com.example.demo.aspect.CR(key=可看出, name=可看出)

理论上来说,注解的key和name,都有彼此的别名,设置了一个值之后,另一个值也绑定该值,实际上需要使用AnnotationUtils才行,原因是该属性值的赋予是经过AnnotationUtils中的getAnnotation方法实现的

image-20240611100407904

相关文章:

  • DenseNet完成Cifer10任务的效果验证
  • MFC四种方法编写多线程
  • 从“数据孤岛”、Data Fabric(数据编织)谈逻辑数据平台
  • 基于百度地图WebGL版二次开发的数据可视化大屏(白天黑夜模式自动切换、标注聚合功能、历史路线轨迹查询)
  • Linux--MQTT(二)通信基本原理
  • 【Python】Python 2 测试网络连通性脚本
  • GenericObjectPool对象池化的介绍与用法
  • Linux在创建用户的时候遇到的错误:useradd: Permission denied.useradd:无法锁定 /etc/passwd,请稍后再试。
  • LeetCode | 434.字符串中的单词数
  • 数据结构之链表的经典笔试题
  • C++笔试强训day42
  • 【实例分享】访问后端服务超时,银河麒麟服务器操作系统分析及处理建议
  • 有趣的傅里叶变换与小波变换对比(Python)
  • Redis系列-4 Redis集群介绍
  • Linux基础指令(二)(文件、权限等)
  • angular2开源库收集
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • egg(89)--egg之redis的发布和订阅
  • JavaScript新鲜事·第5期
  • js
  • JSDuck 与 AngularJS 融合技巧
  • Redux 中间件分析
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SQLServer插入数据
  • 从0到1:PostCSS 插件开发最佳实践
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 前端_面试
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 项目实战-Api的解决方案
  • 写给高年级小学生看的《Bash 指南》
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​MySQL主从复制一致性检测
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #HarmonyOS:基础语法
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (SpringBoot)第七章:SpringBoot日志文件
  • (备忘)Java Map 遍历
  • (分布式缓存)Redis持久化
  • (一)UDP基本编程步骤
  • (转)ORM
  • .NET 中创建支持集合初始化器的类型
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @font-face 用字体画图标
  • [ C++ ] 类和对象( 下 )
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [14]内置对象
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Android Pro] AndroidX重构和映射