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

使用自定义注解+aop实现公共字段的填充

问题描述:对于每个表都有cratetime,updatetime,createby,updateby字段,每次插入数据或者更改数据的时候,都需要对这几个字段进行设置。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//数据库操作类型:UPDATE INSERTOperationType value();
}
@Aspect
@Component
@Slf4j
public class AutoFillAspect {@Pointcut("execution(* com.sky.*.*.*(..)) && @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();//获得数据库操作类型//获取到当前被拦截的方法的参数--实体对象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){//为4个公共字段赋值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) {e.printStackTrace();}}else if(operationType == OperationType.UPDATE){//为2个公共字段赋值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) {e.printStackTrace();}}}}
http://www.lryc.cn/news/153685.html

相关文章:

  • Unity 安卓(Android)端AVProVideo插件播放不了视频,屏幕一闪一闪的
  • 无涯教程-JavaScript - DMIN函数
  • GaussDB数据库SQL系列-层次递归查询
  • pycharm 下jupyter noteobook显示黑白图片不正常
  • Java异常(Error与Exception)与常见异常处理——第八讲
  • 【JAVA】多态
  • android 12 第三方apk系统签名
  • 【论文阅读】自动驾驶中车道检测系统的物理后门攻击
  • ArrayList、LinkedList、Collections.singletonList、Arrays.asList与ImmutableList.of
  • 恒运资本:沪指涨逾1%,金融、地产等板块走强,北向资金净买入超60亿元
  • 解决WebSocket通信:前端拿不到最后一条数据的问题
  • 【java】[maven]每次创建一个maven模块时java compiler版本就是1.6与实际版本不一致(解决本质问题)
  • GPT-5继续秘密训练中!ChatGPT开学大礼包
  • 3.2.0 终极预告!云原生支持新增 Spark on k8S 支持
  • Flutter状态管理 — 探索Flutter中的状态
  • Python中重要的条件语句教程
  • 记录一下自己对linux分区挂载的理解
  • 【机器学习】人工智能概述(文末送书)
  • 电子学会 2023年3月 青少年软件编程Python编程等级考试三级真题解析(选择题+判断题+编程题)
  • C++算法 —— 动态规划(1)斐波那契数列模型
  • Elasticsearch 对比传统数据库:深入挖掘 Elasticsearch 的优势
  • ICG-Tetrazine的合成方法和步骤-星戈瑞
  • C ++ 学习之分文件 实现类
  • vue+elementui前端rules校验缓存问题
  • 使用Vue3和Vite升级你的Vue2+Webpack项目
  • WebSocket 协议及其使用案例
  • Java应用CPU占用过高故障排除
  • 嵌入式Linux开发实操(十五):nand flash接口开发(2)
  • 作为一家游戏开发公司,有哪些经验可以分享?
  • 【100天精通Python】Day51:Python 数据分析_数据分析入门基础与Anaconda 环境搭建