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

news2024/12/27 4:52:35

文章目录

    • 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"; //假设用户权限为 TEST
            System.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 {
    @Autowired
    UserInfoService 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.coloradmin.cn/o/1267865.html

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

相关文章

微信预约小程序制作

对于许多新手来说,制作微信预约小程序可能是一项挑战,但并非不可能。本文将通过详细的步骤,指导您从零开始制作一个微信预约小程序。首先,您需要找一个合适的第三方制作平台或工具,乔拓云网就是其中之一。 找一个合适的…

入门指南:Vue的安装配置和开发环境设置

背景: ​ 这里想讲一讲为什么使用框架,而不使用原生的HTML、CSS、JavaScript写。原生开发虽然灵活,但在大型项目中可能导致代码重复、维护困难等问题,不符合软件工程的"高内聚低耦合"原则。例如,如果每个页…

人工智能 - 图像分类:发展历史、技术全解与实战

目录 一、:图像分类的历史与进展历史回顾深度学习的革命当前趋势未来展望 二:核心技术解析图像预处理神经网络基础卷积神经网络(CNN)深度学习框架 第三部分:核心代码与实现环境搭建数据加载和预处理构建CNN模型模型训练…

Python异常处理:try语句的应用与技巧

更多资料获取 📚 个人网站:ipengtao.com 异常处理在Python中是至关重要的。try-except是用于捕获和处理异常的核心机制之一。让我们深入了解如何使用try-except,处理各种异常情况。 try-except语句 在编程中,异常是指运行时发生…

linux环境下编译安装OpenCV For Java(CentOS 7)

最近在业余时间学习了一些有关图像处理的代码,但是只能本地处理,满足不了将来开放远程服务的需求。 因此,查找并参考了一些资料,成功在centos7环境安装上了opencv 460。 下面上具体安装步骤,希望能帮到有需要的同学。 …

贝叶斯Python实践

贝叶斯统计学是一种基于贝叶斯定理的概率推理方法,它在机器学习领域得到了广泛的应用。Python作为一门简洁、灵活和易学的编程语言,为贝叶斯统计学的实践提供了强大的工具和库。在本文中,我们将探讨贝叶斯在Python中的实践,包括贝…

数据集笔记 :PEMS-BAY

数据地址:DCRNN - Google 云端硬盘 各station 位置:DCRNN/data/sensor_graph/graph_sensor_locations_bay.csv at master liyaguang/DCRNN (github.com) 1 读取 数据 import h5py fileDownloads/pems-bay.h5fh5py.File(file,r) f.keys()f[speed] #&…

氪了几百亿,字节游戏停止了“跳动”

目录 一、氪了几百亿,字节游戏停止了“跳动” 二微软推出跨平台框架 ML.NET 3.0 版:强化深度学习、加强AI效率 一、氪了几百亿,字节游戏停止了“跳动” 朝夕光年,扑了 11月26日,脉脉社区的一个截图内容引起大众热议…

简单位运算

文章目录 求 n n n 的第 k k k 位是二进制的几lowbit(n)操作求解 n n n 的最后一个 1 1 1题目练习AcWing 801. 二进制中1的个数CODE1 原码、补码、反码 求 n n n 的第 k k k 位是二进制的几 我们需要用到&运算符:两位都为 1 1 1 时结果才为 1 1 1 &…

easyrecovery如何恢复手机数据及硬盘数据恢复方法

EasyRecovery16是一款优秀的数据恢复软件,不仅能够兼容windows和mac双重系统,同时还能够识别u盘、存储卡、手机等多种数据储存设备,可恢复的文件类型更是多达百余种。还贴心地准备个人版、专业版和企业版的下载,增加了用户的可选性…

超小尺寸安卓主板|迷你主板|联发科MTK安卓小尺寸主板

一款超小尺寸安卓主板,尺寸仅为43.4mm*57.6mm。这款主板采用了联发科12nm制程工艺的芯片(MT6761/MT6762/MT6765/MT8788),拥有四核/八核64bit A53架构CPU,主频可达2.0GHz,功耗极低,性能卓越。默认内置1G16G内存&#xf…

初次尝到【C知道】的甜蜜

目录 一、场景描述 二、【C知道】使用 三、【C知道】的原理 四、【C知道】的坑 一、场景描述 最近有下面的需求: mysql如何通过命令查看指定表的存储引擎 习惯性在CSDN中搜文章,自己找。 皇天不负有心人,我找到了下面这个内容&#xff0…

AI模型训练——入门篇(二)

导语:本文主要介绍了基于BERT的文本分类方法,通过使用huggingface的transformers库实现自定义模型和任务。具体步骤包括:使用load_dataset函数加载数据集,并应用自定义的分词器;使用map函数将自定义分词器应用于数据集…

光伏开发过程中能运用到的软件有哪些?

在光伏开发过程中,软件的应用贯穿了整个项目生命周期,从设计到建设再到运营管理。下面是一些在光伏开发过程中可能用到的软件工具: 制图和设计软件:CAD软件如AutoCAD、Bentley等被广泛用于光伏系统的设计和制图。这些软件可以帮助…

装饰设计模式(常用)

装饰器模式(装饰设计模式) 我们这些上班族大多都有睡懒觉的习惯,每天早上上班时间都很紧张,于是很多人为了多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,…

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion (Paper reading) Yitong Jiang, The Chinese University of Hong Kong, arXiv23, Code, Paper 1. 前言 我们提出了一种具有潜在扩散的一体化图像恢复系统,名为AutoDIR,它可以…

供应链 | “利刃出鞘”——顶刊POMS论文解读:制造商借助电子商务部门入侵

论文解读者:肖善,温梓曦,张怡雯,杨子豪 编者按: 解密品牌商在线电商平台:组织结构、策略选择、三方共赢 Manufacturer encroachment with an e‐commerce division 原文作者信息 Shi, S., Wang, C., Ch…

C语言进阶指南(14)(部分字符串库函数及其模拟实现)

欢迎来到博主的专栏——C语言进阶指南 博主id:reverie_ly 文章目录 1、strlen()——字符串长度计算函数自定义strlen函数的实现 2、strcpy——字符串拷贝函数strcpy的模拟实现 3.strcat——字符串追加函数strcat的模拟实现 4、strcmp——字符…

喜讯!安全狗入选《2024中国企业服务云图(精选版)》多个细分领域

近日,由吴中区人民政府、苏州市工信局指导,崔牛会主办,苏州太湖国家旅游度假区管委会协办的2023中国SaaS大会在苏州顺利举办。 作为国内云原生安全领导厂商,安全狗突出的多项安全能力也在大会上受到认可。 厦门服云信息科技有限公…

软件需求分析报告

《软件需求分析报告》 软件开发全套资料获取:点我获取