【在线OJ系统】自定义注解实现分布式ID无感自增

embedded/2024/11/15 7:02:09/
实现思路

首先自定义参数注解,然后根据AOP思想,找到该注解作用的切点,也就是mapper层对于mapper层的接口在执行前都会执行该aop操作:获取到对于的方法对象,根据方法对象获取参数列表,根据参数列表判断某个参数上是否加有自定义的注解,如果有则读取注解中的value值,并通过传入对象的引用拿到该对象,此时判断该对象的id值是否位空,如果为空则生成全局唯一id并赋值

代码实现
package com.cloud.cloud_oj_learn.aspects;import com.cloud.cloud_oj_common.annotations.GenerateId;
import com.cloud.cloud_oj_common.enums.Keys;
import jakarta.annotation.Resource;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;/*** Created with IntelliJ IDEA.* Description:* User: PG* Date: 2024-04-16* Time: 18:49*/
@Aspect
@Component
public class GenerateIdAspect {@Resourceprivate StringRedisTemplate stringRedisTemplate;// 初始时间戳private static final long BEGIN_TIME = 1640995200L;// 序列化位数private static final int BITE = 32;public Long getNext(String tableName) {// 1.生成时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIME;// 2,生成序列化号String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));long count = stringRedisTemplate.opsForValue().increment(Keys.GENERATE_ID.getKey() + tableName + ":" + date);// 3.拼接  返回return Long.valueOf(timestamp << BITE | count);}@Before("execution(* com.cloud.cloud_oj_learn.mapper.*.*(..))")public void before(JoinPoint joinPoint) {// 获取方法签名MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();// 获取方法对象Method method = methodSignature.getMethod();// 获取方法参数值数组Object[] args = joinPoint.getArgs();// 获取方法注解Annotation[][] parameterAnnotations = method.getParameterAnnotations();for (int i = 0; i < parameterAnnotations.length; i++) {for (Annotation annotation : parameterAnnotations[i]) {if (annotation instanceof GenerateId) {try {// 获取参数对象Object arg = args[i];// 获取这个对象的类文件Class<?> clazz = arg.getClass();// 获取这个对象的id属性Field idField = clazz.getDeclaredField("id");// 设置字段修改权限idField.setAccessible(true);// 获取注解上的value值String value = ((GenerateId) annotation).value();// 获取该value对应的下一个idLong nextId = getNext(value);// 判断是否为空, 如果为空就赋值 if (idField.get(arg) == null) {idField.set(arg, nextId);}} catch (NoSuchFieldException | IllegalAccessException e) {throw new RuntimeException(e);}}}}}}

图示


http://www.ppmy.cn/embedded/5664.html

相关文章

GL/glu.h usability... no / GL/glu.h presence... no (CentOS8)

文章目录 一、错误信息二、原因分析三、问题解决 一、错误信息 二、原因分析 找不到 GL/glu.h 头文件 系统未安装 glu 库。 三、问题解决 运行命令&#xff1a; yum install mesa-libGLU

4.2冰达机器人:视觉实例-机器人视觉循线、视觉实例-调整循线颜色

4.2.10a视觉实例-机器人视觉循线 本节内容演示一个机器人视觉的视觉循线实例 准备工作&#xff1a;布置一块区域作为循线场所&#xff0c;如下图所示。用蓝色胶带在地面贴一条路线&#xff08;机器人极限转弯半径0.5m&#xff0c;不要贴得过于曲折&#xff09;&#xff0c;将…

期货交易系统有哪些?资管分仓系统时什么?

交易软件有哪些&#xff1f;接下来逐一介绍。 一、交易软件&#xff0c;我们可以选择期货公司自研软件或者第三方交易软件&#xff0c;目前好评比较多的期货交易软件有&#xff1a;文华财经、博易大师、同花顺期货通。 1、文华财经 界面简约&#xff0c;容易上手&#xff0c;云…

网络攻防演练:一场针锋相对的技术博弈与安全防护实践

随着ChatGPT5的即将上线&#xff0c;其安全防护能力面临更为严峻的考验。网络攻防演练作为检验系统安全性能、提升防御体系的关键环节&#xff0c;对于确保ChatGPT5的安全稳定运行具有重要意义。本文将深入探讨网络攻击与防守之间的动态关系&#xff0c;并提供在网络攻防演练中…

uni-app vue3 setup 如何使用 onShow

在uni-app中&#xff0c;onShow是uni.onAppShow的别名&#xff0c;用于监听当前小程序被用户切换到前台运行时触发。在Vue 3中&#xff0c;你可以通过以下方式使用onShow&#xff1a; 在页面的vue文件中添加onShow方法&#xff1a; javascript <button click“onShow”&g…

Centos7 搭建 GitLab服务 下载-安装-配置-卸载 完整版

说明 本文介绍一下 在CentOS7 上执行 GitLab 服务器的离线安装步骤。 本文介绍的步骤适用于 gitlab-ce-10.0.0 至 gitlab-ce-16.xx.xx 版本。 本文详细记录了安装的全部过程&#xff0c;各位读者可以直接1.环境准备 安装依赖 yum install -y curl policycoreutils-python ope…

体波与面波

体波 逆时成像&#xff08;把接收到的信号反传&#xff09;不依赖震源信息的结构成像&#xff0c;不用管接收到的信息是哪里来的。对震源附近的结构有比较好的效果 利用不同类型的波的相干性 成像的弧度与观测系统有关 面波 浙江大学 夏江海 面波可以为岩土工程模型提供几何学、…

Spring Cloud Gateway面试题

Spring Cloud Gateway面试题 1. Spring Cloud Gateway基本概念1.1 什么是Spring Cloud Gateway&#xff1f;1.2 Spring Cloud Gateway和Zuul有什么区别&#xff1f;1.3 Spring Cloud Gateway的核心组件有哪些&#xff1f;1.4 为何需要使用API网关&#xff1f; 2. 路由和过滤器2…