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

文章目录

    • 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.hqwc.cn/news/230654.html

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

相关文章

玩转大数据:2-揭秘Hadoop家族神秘面纱

1. 初识Hadoop家族 在当今的数字化时代,大数据已成为企业竞争的关键因素之一。为了有效地管理和分析这些庞大的数据,许多企业开始采用Hadoop生态系统。本文将详细介绍Hadoop生态系统的构成、优势以及应用场景。 首先,让我们来了解一下什么是…

Failed to connect to gitee.com port 443: Time out 连接超时提示【Bug已完美解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…

西工大网络空间安全学院计算机系统基础实验一(45678)

接着来看第4个函数,int replaceByte(int x, int n, int c),看题目给出的例子,replaceByte(0x12345678,1,0xab) 0x1234ab78。我们可以多写几个例子,进而找出规律,比如: replaceByte(0x12345678,2,0xab) 0…

达梦数据库使用

达梦数据库使用 📑前言 本文主要是【达梦数据库】——达梦数据库简单使用的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他…

PointerEvent实现拖动滑块效果(支持左右吸附)

效果展示&#xff1a; 参数说明&#xff1a; adsorbLen &#xff1a;为0则不吸附&#xff0c;不为0则为左右吸附的距离。也可以自己修改左右的吸附长度。 代码&#xff1a; <template><div class"slider-box" ref"sliderBoxRef"><div re…

洛谷100题DAY8

36.P1416 攻击火星 此题找出规律即可 #include<bits/stdc.h> using namespace std; int n; int main() {cin >> n;cout << max(0, n - 2);return 0; } 37.P1551 亲戚 并查集模板题目 两个人如果使亲戚就合并建立联系&#xff0c;最后进行查找即可 #incl…

【送书活动二期】Java和MySQL数据库中关于小数的保存问题

之前总结过一篇文章mysql数据库&#xff1a;decimal类型与decimal长度用法详解&#xff0c;主要是个人学习期间遇到的mysql中关于decimal字段的详解&#xff0c;最近在群里遇到一个小伙伴提出的问题&#xff0c;也有部分涉及&#xff0c;今天就再大致总结一下Java和MySQL数据库…

一个00后女生在csdn创作1095的创作纪念日

大家好&#xff0c;我是你们熟悉的微枫奶糖 肥晨&#xff0c;今天收到私信&#xff0c;突然发现&#xff0c;我来到CSDN已经1095天了。让我来分享一下吧~ 机缘 不知不觉来csdn已经1095天了&#xff0c;祝贺我在CSDN的创作纪念日&#xff01; 这是一个非常值得纪念的日子&…

PlantUML语法(全)及使用教程-类图

目录 1. 类图1.1、什么是类图1.2、元素声明1.3、类之间的关系1.4、关系上的标签1.5、在元素名称和关系标签中使用非字母1.6、添加方法 1. 类图 类图的设计语法与编程语言的传统语法相似。这种相似性为开发人员提供了一个熟悉的环境&#xff0c;从而使创建图表的过程更简单、更直…

编程实现bf算法

BF算法&#xff08;Brute Force算法&#xff09;是一种朴素的字符串匹配算法&#xff0c;其基本思想是在文本串中不断地比较模式串和文本串中的子串&#xff0c;直到找到匹配的位置或者搜索完整个文本串。 下面是用Python实现BF算法的代码&#xff1a; def bf_search(text, p…

【Openstack Train安装】十、Neutron安装

Neutron&#xff0c;是Openstack中的一大核心组件&#xff0c;设计目标是实现“网络即服务&#xff08;Networking as a Service&#xff09;”。为了达到这一目标&#xff0c;在设计上遵循了基于 SDN 实现网络虚拟化的原则&#xff0c;在实现上充分利用了 Linux 系统上的各种网…

【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)

文章目录 刷题前唠嗑题目&#xff1a;无限集中的最小数字题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 今天的题目也比较的简单&#xff0c;因为数据量不大&#xff0c;所以什么做法都能过的去 题目&a…