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

java自定义注解实现

自定义注解实现

  • 定义注解
  • 切面实现注解功能
  • 使用注解

定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface NoRepeatSubmit {int lockTime() default 3;TimeUnit timeUint() default TimeUnit.SECONDS;enum TimeUnit {SECONDS, MINUTES}
}
@Retention:元注解,表示在运行时生效
@Target:元注解,标注注解用在类,方法还是字段上
@Documentted:元注解,表示会生成到javadoc中

切面实现注解功能

引入切面依赖,springaop中包含了aspectJ的功能

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>3.0.7</version></dependency>

使用到了redis,增加redis配置依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.0.7</version></dependency>
spring:data:redis:database: 0host: x.x.x.xport: 4410password:XXXtimeout: 5000lettuce:pool:max-active: 32max-idle: 16min-idle: 8max-wait: -1
package com.hoitung.fyz.aspect;import cn.hutool.core.date.DateUtil;
import com.hoitung.fyz.annotation.NoRepeatSubmit;
import jakarta.annotation.Resource;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.util.Objects;@Component
@Aspect
public class NoRepeatSubmitAspect {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Pointcut(value = "@annotation(noRepeatSubmit)")public void pointCutNoRepeatSubmit(NoRepeatSubmit noRepeatSubmit) {}@Around(value = "pointCutNoRepeatSubmit(noRepeatSubmit)", argNames = "joinPoint,noRepeatSubmit")public Object around(ProceedingJoinPoint joinPoint, NoRepeatSubmit noRepeatSubmit) throws Throwable {String key = "test";int i = noRepeatSubmit.lockTime();String value = stringRedisTemplate.opsForValue().get(key);if(Objects.nonNull(value)) {long oldSec = Long.valueOf(value);long curSec = DateUtil.currentSeconds();if(curSec - oldSec > 1) {return "请勿重复提交";}} else {stringRedisTemplate.opsForValue().set(key, String.valueOf(DateUtil.currentSeconds()));}return joinPoint.proceed();}}

使用注解

@RestController
@RequestMapping("/test")
public class TestController {@NoRepeatSubmit(lockTime = 1)@RequestMapping("/1")public String test() {return "test";}
}

测试结果:
在这里插入图片描述

http://www.dtcms.com/a/352228.html

相关文章:

  • 开发electron时候Chromium 报 Not allowed to load local resource → 空白页。
  • 在使用spring ai进行llm处理的rag的时候,选择milvus还是neo4j呢?
  • gorm 枚举查询遇到的问题
  • 【Python】Python日志模块完全指南:从配置到常见错误排查
  • 深入OpenHarmony后台任务“黑匣子”:BackgroundTaskMgr框架全栈解析与实战避坑指南
  • C#编程:贪吃蛇游戏
  • 使用linux+javascript+html+mysql+nodejs+npm+express等构建信息资料采集系统
  • FreeRTOS 同步互斥与任务协作 学习笔记
  • 【Protues仿真】定时器
  • 对讲联动电梯门禁系统通过深度集成对讲、梯控、身份认证三大模块,在提升便捷性的同时,以“权限后置发放+电梯状态闭环检测“为核心,实现安全性与可靠性的双重突破。
  • 解决VSCode无法下载服务器端 Server问的题
  • 当 C++ 用于嵌入式开发:优点和缺点
  • .gitignore 文件相关使用配置
  • 【Redis】安装和基础命令
  • 十、Java面向对象编程入门指南:继承与多态
  • 利用 OpenTelemetry 建设尾部采样
  • 大模型全栈学习路线:4 - 6 个月从入门到实战,打通技术与业务闭环
  • [灵动微电子 霍尔FOC MM32BIN560C]从引脚到应用
  • 《黑客帝国》解构:白帽黑客的极客思维宇宙
  • vue3写一个简单的时间轴组件
  • 【python】python利用QQ邮箱SMTP发送邮件
  • k8s pod resources: {} 设置的含义
  • 支持向量机(第二十九节课内容总结)
  • TensorFlow 面试题及详细答案 120道(61-70)-- 高级特性与工具
  • 如何在项目中集成XXL-JOB
  • uniapp 引入使用u-view 完整步骤,u-view 样式不生效
  • 重复文件删除查找工具 Duplicate Files Search Link v10.7.0
  • 【深度学习】Transformer 注意力机制与 LoRA target_modules 详解
  • 如何安装 VS2019 和 .NET Core SDK 2.2.301(winx64)?完整操作步骤(附安装包下载)
  • 基于YOLOv11训练无人机视角Visdrone2019数据集