公共字段填充(AOP的使用)

Thread是线程池,ThreadLocal是线程变量,每个线程变量是封闭的,与其它线程变量分隔开来,在sky-common下的com.sky.context包下有一个Basecontext类

public class BaseContext {//每一个上下文创建了一个线程变量,用来存储long类型的id//创建三个方法,用来设置,取用,删除idpublic static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}}

在jwt拦截器中我们会将前端传过来的id设置到当前线程中

public class JwtTokenAdminInterceptor implements HandlerInterceptor {@Autowiredprivate JwtProperties jwtProperties;/*** 校验jwt** @param request* @param response* @param handler* @return* @throws Exception*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("当线程的id"+Thread.currentThread().getId());//判断当前拦截到的是Controller的方法还是其他资源if (!(handler instanceof HandlerMethod)) {//当前拦截到的不是动态方法,直接放行return true;}//1、从请求头中获取令牌String token = request.getHeader(jwtProperties.getAdminTokenName());//2、校验令牌try {log.info("jwt校验:{}", token);//这个Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());log.info("当前员工id:", empId);//这里BaseContext.setCurrentId(empId);//3、通过,放行return true;} catch (Exception ex) {//4、不通过,响应401状态码response.setStatus(401);return false;}}
}

紧接着想要使用AOP我们需要定义一个AutoFill注解

//表示注解到方法上
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)//表示注解运行时仍保留
public @interface AutoFill {//在common包下,包含insert和update两种操作OperationType value();
}

然后我们就可以在AutoFillAspect对指定包下满足条件的方法进行拦截和处理

@Aspect
@Component
@Slf4j
public class AutoFillAspect {//为首的*表示返回类型为任意,com.sky.mapper.*.*这个表示//mapper包下所有的类(..)所有方法,&&后面表示加了AutoFill注解的方法//指定被拦截的方法@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut(){}//在执行前做的操作@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("开始进行公共字段自动填充...");//获取到当前被拦截的方法上的数据库操作类型MethodSignature signature = (MethodSignature) joinPoint.getSignature();AutoFill autoFill=signature.getMethod().getAnnotation(AutoFill.class);OperationType operationType=autoFill.value();
//        MemberSignature signature = (MemberSignature) joinPoint.getSignature();
//        AutoFill autoFill=signature.getMothod().getAnnotation(AutoFill.class)//获取到当前被拦截的方法的参数-实体对象Object[] args=joinPoint.getArgs();if(args==null||args.length==0)return;Object entity=args[0];//准备赋值的类型LocalDateTime now=LocalDateTime.now();Long currentId= BaseContext.getCurrentId();//根据当前不同的操作类型,为对应的属性通过反射来赋值if(operationType==OperationType.INSERT){try {Method setCreateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME,LocalDateTime.class);Method setCreateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class);Method setUpdateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);setCreateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {throw new RuntimeException(e);}}else if(operationType==OperationType.UPDATE){try {Method setUpdateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {throw new RuntimeException(e);}}}
}

首先着重讲一下MethodSignature,由于我是跟着视频操作的,所以我一开始没有注意到一个很重要的点,MethodSignature到底是否加了extend,但看到这个类都是只读,我便认为它一开始就加了extend,然后再MethodSignature到Signature之间有这样一层关系Signature->MemberSignature->CodeSignature->MethodSignature.为什么需要这样继承呢,因为Signature没有getMethod方法,而我们需要获取方法上的注解类型,故进行这样一步操作.用于后面操作的条件判断.

接着在需要公共字段填充的类方法上加上@AutoFill(value="")注解,""里面填写对应的方法,这里只定义了update和insert.

举个例子

@Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +" VALUES" +" (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")@AutoFill(value = OperationType.INSERT)void insert(Category category);

内容完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/706040.html

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

相关文章

Learn Next.js(浅全栈)

Learn Next.js 中文教程

springboot005学生心理咨询评估系统

springboot005学生心理咨询评估系统 亲测完美运行带论文&#xff1a;获取源码&#xff0c;私信评论或者v:niliuapp 运行视频 包含的文件列表&#xff08;含论文&#xff09; 数据库脚本&#xff1a;db.sql其他文件&#xff1a;ppt.ppt论文&#xff1a;开题.doc论文&#xf…

git上传项目到github

有用git进行版本控制和github存储东西的需求 之前会的操作忘了&#xff0c;在此总结一套流程化方案 github上创建仓库绑定用户&#xff1a;打开git-bash&#xff0c;填写用户名和邮箱作为标识 $ git config --global user.name "" $ git config --global user.emai…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的&#xff0c;它针对稠密向量数据集的相似搜索而设计&#xff0c;能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片&#xff0c;流式数据插入&#xff0c;动态schema&#xff0c…

美团小程序mtgsig1.2逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

cypress的安装使用

cypress npm install -g cnpm --registryhttps://registry.npm.taobao.org cypress的启动打开 npx cypress open js函数的回调 function print(string,callback){console.log(string)callback() } print("a",function(){print("b",function(){console.l…

LeetCode题练习与总结:交错字符串--97

一、题目描述 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; 示例 1&#xff1a; 输入&#xff1a;s1 "aa…

Ubuntu 安装 eclipse 的详细过程及工程创建和编译配置

目录 一、安装环境二、下载依赖 java jdk三、下载 eclipse四、安装4.1 java 环境4.2 eclipse 安装4.3 打开 eclipse 五、配置 eclipse5.1 新建 C 工程5.2 工具链 配置5.3 头文件路径5.4 链接库5.5 编译 一、安装环境 Ubuntu 版本&#xff1a;22.04.3 位数&#xff1a;64-bit 二…

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal&#xff1a;S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

微服架构基础设施环境平台搭建 -(七)Kubesphere pod内安装vimping命令

微服架构基础设施环境平台搭建 -&#xff08;七&#xff09;Kubesphere pod安装vim&ping命令 在K8s集群运维过程&#xff0c;需要进入pod容器内通过ping来测试网络是否通畅&#xff0c;或使用vim进行编辑文件&#xff0c;但是pod容器默认情况下是不支持ping、vim命令的&…

绝地求生:PGS3参赛队伍跳点一览,17压力有点大,4AM与PeRo大概率不roll点

在PCL春季赛结束后&#xff0c;PGS3的参赛队伍名单以及分组就正式确定了&#xff0c;最后确定名额的DDT和NH被安排在了A组和B组&#xff0c;感觉这次PGS3的分组比较均衡&#xff0c;没有“死亡之组”一说。这段时间已经有网友汇总了PGS3队伍在各个地图的跳点&#xff0c;并且把…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.7讲 GPIO中断实验-编写按键中断驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…