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

文章目录

    • 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.mzph.cn/news/182292.shtml

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

相关文章

【小聆送书第一期】让架构师的成神之路温暖你这个不景气的冬天

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言 书籍一览 ⛳️书籍一⛳️书籍二⛳️书籍三⛳️书籍四⛳️书籍五⛳️书籍六⛳️书…

C++中的类型转换和异常

C类型转换 类型转换(cast) 是将一种数据类型转换成另一种数据类型。例如,如果将一个整型 值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。 转换是非常有用的,但是它也会带来一些问题,比如在转换指针时&#xff0c…

java使用poi读写excel(处理上下标和科学计数法)

Background 要读写如下图所示的excel,符号和单位中包含上下标,在读写时需要特殊处理;取值列中是科学计数法,读写时需要特殊处理;excel中包含多个sheet,读的时候把所有sheet的数据读出来,写的时候…

OSCP系列靶场-Esay保姆级

总结 getwebshell : ftp可匿名登录 → 发现隐藏文件夹 → 发现ssh密钥 → 猜解ssh用户名 → ssh密钥登录 提 权 思 路 : 发现suid权限文件 → cpulimit提权 准备工作 启动VPN 获取攻击机IP → 192.168.45.191 启动靶机 获取目标机器IP → 192.168.179.130 信息收集-端口扫…

虚拟机指定开放数据库3306端口

1、查看当前防火墙状态: sudo firewall-cmd --state 2、开放指定端口 sudo firewall-cmd --zonepublic --add-port3306/tcp --permanent 3、重新加载防火墙配置 sudo firewall-cmd --reload 4、检查端口是否开放成功 sudo firewall-cmd --zonepublic --list-por…

行情分析——加密货币市场大盘走势(11.29)

大饼已经形成了底背离,即MACD往下走,而价格还在往上走,这种后续往往会大跌。继续把空单拿好,已经持仓的无需加仓。多次上涨却一直不能突破,说明多空和空军力量都很强,等待后续出方向。在笔者看来&#xff0…

HotSpot 虚拟机中的对象

1、对象的创建 Java 是一门面向对象的编程语言,程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常仅仅是一个 new 关键字,而虚拟机中,对象(仅限于普通 Java 对象,不包括数组和 Class …

通往AGI的大模型MultiAgent的RL是对的但HF有上限

OpenAI高管Mira Murati周三告诉员工,一封关于AI取得突破的信件促使董事会采取了解雇行动。一位消息人士透露,OpenAI在Q*项目上取得了进展,内部人士认为这可能是OpenAI在超级智能领域的突破。这名消息人士称,虽然Q*的数学成绩只是小…

统计元音字母c语言

以下是一个简单的C语言程序&#xff0c;用于统计一段文本中的元音字母数量&#xff1a; #include <stdio.h>#include <string.h>int main() { char str[1000]; int vowels 0; printf("请输入一段文本&#xff1a;\n"); fgets(str, siz…

消息队列好文收集

Kafka Kafka之ISR机制的理解-CSDN博客

关于神经网络,你不得不知的三大要点

什么是神经网络&#xff1f; 神经网络是一个具有相连节点层的计算模型&#xff0c;其分层结构与大脑中的神经元网络结构相似。神经网络可通过数据进行学习&#xff0c;因此&#xff0c;可训练其识别模式、对数据分类和预测未来事件。 神经网络将您的输入细分为多个抽象层。比…

Unity Instantiate的用法

之前总结Unity实例化物体的文章&#xff1a;Unity 实例化物体以及赋予到父物体之下-CSDN博客 现在回头看来&#xff0c;感觉总结得不够全面&#xff0c;尤其关于Instantiate的用法&#xff0c;过于简陋了。 关于Instantiate&#xff0c;它实际上有10个语法&#xff1a; Obje…

JavaScript编程进阶 – Return语句

JavaScript编程进阶 – Return语句 JavaScript Programming Advanced – Return Statement By JacksonML 就像人们习惯的函数一样&#xff0c;总觉得在函数体最后需要一个return语句&#xff0c;标志着函数的结束,就像下面这个函数 theFunc() 那样。 function theFunc() { re…

插入区间[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个无重叠的 &#xff0c;按照区间起始端点排序的区间列表。在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#x…

沈阳师范大学期末考试复习pta循环数组函数指针经典编程题汇总+代码分析

前言&#xff1a;临近期末&#xff0c;接下来给大家分享一些经典的编程题&#xff0c;方便大家复习。不一定难&#xff0c;但都是入门的好题&#xff0c;尽可能的吃透彻。因为据说期末考试的题很多来自pta上面的原题。 对于一些语言我是用c来写的&#xff0c;不妨碍理解&#…

Linux下文件操作函数

一.常见IO函数 fopen fclose fread fwrite fseek fflush fopen 运行过程 &#xff1a;打开文件 写入数据 数据写到缓冲区 关闭文件后 将数据刷新入磁盘 1.fopen 返回文件类型的结构体的指针 包括三部分 1).文件描述符&#xff08;整形值 索引到磁盘文件&#xff09;…

AI4S Cup学习赛-中枢神经系统药物研发:药物筛选与优化

赛题介绍 链接&#xff1a;Bohrium 案例广场 (dp.tech) 中枢神经系统类疾病长期以来存在着重要的临床未满足需求。据统计&#xff0c;在当前人口老龄化趋势下&#xff0c;阿兹海默&#xff08;AD&#xff09;、帕金森病&#xff08;PD&#xff09;等神经退行性疾病和脑癌、中…

智能视野:图像识别的全球技术革命

图像识别技术正在全球范围内引领着一场技术革命&#xff0c;为各个领域带来深刻的变革。这一全球性的技术演进不仅在商业和科学领域展现出巨大潜力&#xff0c;还为人们的日常生活提供了更智能、更便捷的体验。 1. 商业智能的崛起&#xff1a; 图像识别技术在商业领域发挥着关…

echarts图表显示不全

图表显示是显示了&#xff0c;但是没有展示全部&#xff0c;一看控制台div的高度只有1px了&#xff0c;手动修改高度也只是拉伸图表&#xff0c;并没有按规定的尺寸展示 随之开始思考为什么呢 ? ? ? 因为 Echarts 的依赖是惰性的&#xff0c;需要手动设置resize&#xff0…

LeetCode37. Sudoku Solver

文章目录 一、题目二、题解 一、题目 Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy all of the following rules: Each of the digits 1-9 must occur exactly once in each row. Each of the digits 1-9 must oc…