自定义注解的定义及使用场景

文章目录

    • 1. 自定义注解如何使用
    • 2. 自定义注解使用场景
      • 2.1 自定义注解使用AOP做权限校验
      • 2.2 自定义注解使用AOP记录用户操作日志
      • 2.3 自定义注解使用AOP记录接口请求时长

1. 自定义注解如何使用

需要使用@interface修饰,加上三个元注解

  • @Documented:生成API文档使用
  • @Target:决定此注解能加的范围,类、方法、属性上面
  • @Retention:作用域(在什么时候有作用,java–》class–》运行时)
@Documented
@Target(ElementType.METHOD)//决定此注解能加的范围,类,方法,属性
@Retention(RetentionPolicy.RUNTIME)//作用域(在什么时候有作用,java--》class--》运行时)
public @interface SysLog {String name() default "";
}

2. 自定义注解使用场景

2.1 自定义注解使用AOP做权限校验

1. 编写自定义注解


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface Authority {String authority() default "";
}

2. 编写切面

定义切面并编写权限放行的逻辑

@Aspect
@Component
public class AuthoritionAspect {@Pointcut("execution(* com.aigaofeng.aopdemo.controller.UserController.*(..))")public void pointcut() {}@Around("pointcut()")public void advice(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Method method = methodSignature.getMethod();if (!method.isAnnotationPresent(Authority.class)) {//没有使用注解默认放行joinPoint.proceed(); } else {Authority authority = fetchPermission(methodSignature);//[1] 取出请求方的权限信息String userPermission = "root"; //假设用户权限为 TESTSystem.out.println("用户权限: " + userPermission);//[2] 和注解的值做比较 authority.authority()if (userPermission.equals(authority.authority())){//[3] 校验通过放行用户System.out.println("放行");joinPoint.proceed();}return;}}private Authority fetchPermission(MethodSignature methodSignature) {return methodSignature.getMethod().getAnnotation(Authority.class);}}

3. 编写测试类

在方法上使用自定义注解 @Authority(authority = “root”)

@RestController
public class UserController {@AutowiredUserInfoService userInfoService;@Authority(authority = "root")@RequestMapping("/getUser")public String getUser(){Integer userCount = userInfoService.getUserCount();System.out.println("获取数据库的users:"+userCount);return "success";}
}

4. 测试

在浏览器或postman上请接口,观察日志
在这里插入图片描述
在这里插入图片描述

2.2 自定义注解使用AOP记录用户操作日志

1. 编写自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface SysLog {String operation() default "";//操作内容
}

2. 创建对应的实体类

@Data
@TableName(value = "user_info")
public class UserInfo implements Serializable {private  static final long serialVersionUID = 1L;private String id;private String name;private String email;private String phone;private Date  logTime;
}

3. 编写切面

@Aspect
@Component
public class SysLogAspect {/*** 定义@Before增强,拦截带有@SysLog注解的方法,并记录操作日志*/// 定义切点(拦截的规则)@Pointcut("execution(* com.aigaofeng.aopdemo.controller.UserController.*(..))")public void pointcut() {}@Around("pointcut()")public  Object around(ProceedingJoinPoint point) throws Throwable {long start = System.currentTimeMillis();Object[] args = point.getArgs();Object proceed = point.proceed(point.getArgs());//调用目标方法long end = System.currentTimeMillis();long consuming = end - start;//方法执行时间//获取签名从而获取自定义注解上的value值MethodSignature methodSignature = (MethodSignature) point.getSignature();SysLog sysLog = methodSignature.getMethod().getAnnotation(SysLog.class);String declaringTypeName = methodSignature.getDeclaringTypeName();//类名String name = methodSignature.getName();//方法名String qualified = declaringTypeName+name;//全限定名UserInfo userInfo = new UserInfo();userInfo.setName("张三");userInfo.setId("1001");userInfo.setPhone("15523637367");userInfo.setEmail("526381269.qq.com");userInfo.setLogTime(new Date());System.out.println("请求对对象:"+ userInfo.getName());return proceed;}}

4. 编写测试方法

 @SysLog(operation = "添加用户") // 调用加了@SysLog注解的方法需要额外的记录用户的操作日志@GetMapping("/test")public String test() {System.out.println("谁请求了该方法");return "ok";}

5. 测试
在这里插入图片描述
在这里插入图片描述

2.3 自定义注解使用AOP记录接口请求时长

步骤:
1.自定义注解
2.编写切面类

@Around("pointcut()")public  Object around(ProceedingJoinPoint point) throws Throwable {long start = System.currentTimeMillis();Object[] args = point.getArgs();Object proceed = point.proceed(point.getArgs());//调用目标方法long end = System.currentTimeMillis();long consuming = end - start;//方法执行时间return proceed;}

3.在方法上使用自定义注解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/205244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题:说一下MyBatis动态代理原理?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.MyBatis简介2.使用步骤2.1、引入依赖2.2、配置文件2.3、接口定义2.4、加载执行 3.原理解析 1.MyBatis简介 MyBatis是一个ORM工具,封装了JDBC的操作&a…

Golang中rune和Byte,字符和字符串有什么不一样

Rune和Byte,字符和字符串有什么不一样 String Go语言中, string 就是只读的采用 utf8 编码的字节切片(slice) 因此用 len 函数获取到的长度并不是字符个数,而是字节个数。 for循环遍历输出的也是各个字节。 Rune rune 是 int32 …

在微服务架构中的数据一致性

当从传统的单体应用架构转移到微服务架构时,特别是涉及数据一致性时,数据一致性是微服务架构中最困难的部分。传统的单体应用中,一个共享的关系型数据库负责处理数据一致性。在微服务架构中,如果使用“每个服务一个数据库”的模式…

Ros报错:The Plugin for class ‘jsk_rviz_plugin/Plotter2D‘ failed to load

一般出现这种情况,是提醒Ros缺少某种库: 图中显示的错误是说明少了jsk_rviz_plugins库,他是一个提供原始rviz插件的包。 解决办法是安装相应的库与插件: #根据自己ROS的版本选择相应的指令 # ubuntu20.04:noetic sudo apt-get i…

幼教智能时代精英论坛北京举行

中国日报11月29日电 近日,智能时代赢之道—2023幼教智能时代精英论坛在北京泰山饭店成功举办,来自全国各地的近百位幼儿园园长、幼教老师集聚一堂,探索智能时代幼教的智慧化解决方案。 伴随“教育数字化战略行动”的深入开展,智慧…

Linux高级IO

文章目录 一.IO的基本概念二.钓鱼五人组三.五种IO模型四.高级IO重要概念1.同步通信 VS 异步通信2.阻塞 VS 非阻塞 五.其他高级IO六.阻塞IO七.非阻塞IO 一.IO的基本概念 什么是IO? I/O(input/output)也就是输入和输出,在著名的冯诺…

python爱心代码高级

在Python中,我们可以使用matplotlib库来创建一个更高级的爱心图形。以下是一个示例: import matplotlib.pyplot as pltimport numpy as npx np.linspace(-2, 2, 1000)y1 np.sqrt(1-(abs(x)-1)**2)y2 -3*np.sqrt(1-(abs(x)/2)**0.5)fig, ax plt.subp…

树与二叉树堆:链式二叉树的实现

目录 链式二叉树的实现: 前提须知: 前序: 中序: 后序: 链式二叉树的构建: 定义结构体: 初始化: 构建左右子树的指针指向: 前序遍历的实现: 中序…

Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

之前经常使用Spannable 这次主要在String.xml使用&#xff1a;<![CDATA[和]]> 效果&#xff1a; <resources><string name"str_bianse"><![CDATA[变色 <font color"#ff0000">曲项向天歌</font> 白毛浮绿水]]></st…

Leetcode—266.回文排列【简单】Plus

2023每日刷题&#xff08;四十&#xff09; Leetcode—266.回文排列 C语言实现代码 char chara[26] {0};int calculate(char *arr) {int nums 0;for(int i 0; i < 26; i) {nums arr[i];}return nums; }bool canPermutePalindrome(char* s) {int len strlen(s);for(in…

InstructDiffusion-多种视觉任务统一框架

论文:《InstructDiffusion: A Generalist Modeling Interface for Vision Tasks》 github&#xff1a;https://github.com/cientgu/InstructDiffusion InstructPix2Pix&#xff1a;参考 文章目录 摘要引言算法视觉任务统一引导训练集重构统一框架 实验训练集关键点检测分割图像…

Vue3的项目创建到启动

Vue3的项目创建 检查node版本创建 npm init vuelatest 安装依赖 项目启动 启动成功

OpenAI再次与Sam Altman谈判;ChatGPT Voice正式上线

11月22日&#xff0c;金融时报消息&#xff0c;OpenAI迫于超过700名员工联名信的压力&#xff0c;再次启动了与Sam Altman的谈判&#xff0c;希望他回归董事会。 在Sam确定加入微软后&#xff0c;OpenAI超700名员工签署了一封联名信&#xff0c;要求Sam和Greg Brockman&#x…

Spring---对象的存储和读取

文章目录 Spring对象的存储创建Bean对象将Bean对象存储到spring中添加配置文件存储Bean对象 Spring对象的读取得到Spring上下文对象从Spring中取出Bean对象使用Bean对象 Spring对象的存储 创建Bean对象 Bean对象其实就是一个普通的Java对象。我们按照创建Java对象的方式来创建…

【云原生】什么是 Kubernetes ?

什么是 Kubernetes &#xff1f; Kubernetes 是一个开源容器编排平台&#xff0c;管理着一系列的 主机 或者 服务器&#xff0c;它们被称作是 节点&#xff08;Node&#xff09;。 每一个节点运行了若干个相互独立的 Pod。 Pod 是 Kubernetes 中可以部署的 最小执行单元&#x…

USB驱动开发基础

USB标准 USB1.0&#xff0c; 1996&#xff0c;低速1.5Mbps和高速12Mbps&#xff0c;USB1.1 iMac G3&#xff0c;Type A和Type B接口USB 2.0 2000&#xff0c; 480Mpbs&#xff0c;Type A/B/C接口、Micro A/BUSB 3.0 5Gbps, 随着USB 3.2命名规定&#xff0c;现在也叫USB 3.2 Ge…

Linux网络——数据链路层

目录 一.认识以太网 二.以太网帧格式 三.认识MAC地址 四.认识MTU 五.以太局域网的通信原理 六.其他重要协议 1.DNS协议 2.域名简介 3.ICMP协议 4.NAT技术 5.NAT技术的缺陷 6.NAT和代理服务器 一.认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标…

docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

数据库的重要你了解多少?如何保障数据库的安全?

随着信息技术的快速发展&#xff0c;数据库已经成为企业、组织以及个人日常生活中不可或缺的一部分。然而&#xff0c;随着数据库的广泛应用&#xff0c;其安全性问题也日益凸显。数据库的安全性主要包括数据的完整性、保密性和可用性。本文将探讨数据库安全性的重要性、以及如…

常使用的定时任务

常使用的定时任务 一、 linux自带的定时任务 1、crontab 有这样一个需求&#xff1a;我们使用Java写一个工具jar包在系统空闲的时候去采集已经部署在Linux系统上的项目的一 些数据&#xff0c;可以使用 linux 系统的 crontab。 运行crontab -e&#xff0c;可以编辑定时器&…