Spring AOP + 自定义注解 实现公共字段的填充

news2024/11/26 10:46:38

Spring AOP + 自定义注解 实现公共字段的填充

在这里插入图片描述

代码冗,不利于后期维护.

定义操作这些字段的方法类型

在这里插入图片描述

实现步骤:

  • 自定义注解AutoFill,用于表示操作这些公共字段的方法
  • 自定义切面类AutoFillAspect,统一拦截,通过反射获取方法入参,并填充公共字段
  • 在Mapper的insert、update的方法上加上自定义的AutoFill注解

代码:

- 不使用mybatis-plus自带的填充注解

必要依赖

 <dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
     <version>1.8.7</version>
</dependency>
 <dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.1.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.7.5</version>
</dependency>
  <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.18</version>
</dependency>

1、自定义注解AutoFill,用于表示操作这些公共字段的方法

import com.cwh.mpdemo.enums.OpreaType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解,表示方法
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {

    /**
     * 操作类型
     *
     * @return
     */
    OpreaType value() default OpreaType.INSERT;
}

2、自定义切面类AutoFillAspect,统一拦截,通过反射获取方法入参,并填充公共字段


import com.cwh.mpdemo.annotation.AutoFill;
import com.cwh.mpdemo.enums.OpreaType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;

/**
 * @Aspect 标注为切面类
 */
@Aspect
@Component
@Slf4j
public class AutoFillaspect {
    
    // 定义切点
    @Pointcut("execution(* com.cwh.mpdemo.mapper.*.*(..)) && @annotation(com.cwh.mpdemo.annotation.AutoFill)")
    public void pointcut(){}

    // 定义通知
    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
        log.info("auto fill start...");
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);
        OpreaType value = annotation.value();
        //获取签名方法的入参
        Object[] args = joinPoint.getArgs();
        if (args.length ==0 ||args == null)  {
            return;
        }
        Object arg = args[0];
        try {
        // 填充字段
        if (value == OpreaType.INSERT){
            //通过反射给入参对象的字段赋值
        arg.getClass().getDeclaredMethod("setCreateTime", Date.class)
            .invoke(arg, Date.from(LocalDateTime.now().toInstant(ZoneOffset.UTC)));
  //实际中从ThreadLocal获取用户id          
          arg.getClass().getDeclaredMethod("setCreateUser",String.class).invoke(arg,"test");
        } 
          arg.getClass(). getDeclaredMethod("setUpdateTime",Date.class).invoke(arg,Date.from(LocalDateTime.now().toInstant(ZoneOffset.UTC)));
            //实际中从ThreadLocal获取用户id
        arg.getClass().getDeclaredMethod("setUpdateUser",String.class).invoke(arg,"test");
        }catch (Exception exception){
            log.error("auto fill error:{}",exception.getMessage());
        }

        log.info("auto fill end...");
    }
}
public enum OpreaType {
    INSERT,
    UPDATE;
}

3、在Mapper的insert、update的方法上加上自定义的AutoFill注解

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cwh.mpdemo.annotation.AutoFill;
import com.cwh.mpdemo.domain.SessionDomain;

public interface SessionLoginMapper extends BaseMapper<SessionDomain> {

    @AutoFill
    void insertData(SessionDomain sessionDomain);
}

- 使用mybatis-plus自带的填充注解

首先在实体对象上加自动填充属性注解fill = FieldFill.INSERT

@Data
@TableName("session_login")
public class SessionDomain {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableField
    private String userName;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT)
    private String createUser;
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;
    @TableField(fill = FieldFill.UPDATE)
    private String updateUser;
}

实现元数据对象处理器接口MetaObjectHandler,实现insertFill,updateFill逻辑

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;

@Component
public class AutoFillHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {

        // 设置属性值
         this.setFieldValByName("createTime", Date.from(LocalDateTime.now().toInstant(ZoneOffset.UTC)), metaObject);
         this.setFieldValByName("updateTime", Date.from(LocalDateTime.now().toInstant(ZoneOffset.UTC)), metaObject);
         //实际中从ThreadLocal获取用户id
         this.setFieldValByName("createUser", "1", metaObject);
         this.setFieldValByName("updateUser", "1", metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //实际中从ThreadLocal获取用户id
        this.setFieldValByName("updateTime", Date.from(LocalDateTime.now().toInstant(ZoneOffset.UTC)), metaObject);
        this.setFieldValByName("updateUser", "1", metaObject);
    }
}	

剩下就是在service层使用mapper接口insert、update数据即可。

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

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

相关文章

一个很变态,但能快速掌握软考高项的野路子

软考已经迫在眉睫&#xff0c;今天给各位整理了软考高项 信息系统项目管理师 的重要知识点口诀&#xff0c;只要大家能把这些都背下来&#xff0c;对你们掌握高项事倍功效&#xff0c;赶紧行动起来吧 2024年上半年信息系统项目管理师知识点口诀汇总 一、IT部分 智慧城市5个核心…

爬虫逆向实战(39)-某某兔装修网登陆(RSA)

一、数据接口分析 主页地址&#xff1a;某某兔装修网 1、抓包 通过抓包可以发现登陆是表单提交 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块&#xff0c;可以发现有一个val和password的加密参数 请求头是否加密&#xff1f; 无响应是否加密…

RK3568驱动指南|第十四篇 单总线-第158章DS18B20编写字符设备驱动框架

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【微众银行笔试题汇总】 2024-03-31-微众银行春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新微众银行近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&…

从小米造车引发对公司跨界的思考

目录 1. 十年布局 2. 人才战略和产品定位 3. 公司跨界启示 3月28日&#xff0c;小米新车发布会轰动全网&#xff0c;这是一场令人激动的发布会&#xff1b; 微博、小红书、知乎和朋友圈关于小米SU7价格、配置的话题一直挂在热搜&#xff1b;身边从老到少也都在讨论SU7&…

matlab中旋转矩阵函数

文章目录 matlab里的旋转矩阵、四元数、欧拉角四元数根据两向量计算向量之间的旋转矩阵和四元数欧拉角转旋转矩阵旋转矩阵转欧拉角旋转矩阵转四元数参考链接 matlab里的旋转矩阵、四元数、欧拉角 旋转矩阵dcmR四元数quatq[q0,q1,q2,q3]欧拉角angle[row,pitch,yaw] % 旋转矩阵…

HarmonyOS 应用开发之自定义组件冻结功能

自定义组件处于非激活状态时&#xff0c;状态变量将不响应更新&#xff0c;即Watch不会调用&#xff0c;状态变量关联的节点不会刷新。通过freezeWhenInactive属性来决定是否使用冻结功能&#xff0c;不传参数时默认不使用。支持的场景有&#xff1a;页面路由&#xff0c;TabCo…

提质增效|大型汽车制造业运维精细化管理建设实战

项目背景 某大型汽车制造企业随着数字化技术的深入应用&#xff0c;对运维在“质量与效率”方面的精细化管理有了更高的要求。借助云智慧运维指标体系实现了 IT 架构的智能化与可视化&#xff0c;高效解决系统显性问题&#xff0c;积极处理系统隐性问题&#xff0c;提升系统稳…

第四节 增加可选事件流操作

一、常见可选事件流案例说明 二、原型案件设置说明 1、设立元件 2、控制逻辑 设置对应矩形可选事件流面板状态&#xff0c;显示\隐藏 当前事件流提示元件&#xff0c;页面完成跳转设置。 3、添加可选事件 对于多个可选事件可以添加多个矩形进行引导&#xff0c;数量不定&…

卷积神经网络(CNN)的数学原理解析

文章目录 前言 1、介绍 2、数字图像的数据结构 3、卷积 4、Valid 和 Same 卷积 5、步幅卷积 6、过渡到三维 7、卷积层 8、连接剪枝和参数共享 9、卷积反向传播 10、池化层 11、池化层反向传播 前言 本篇主要分享卷积神经网络&#xff08;CNN&#xff09;的数学原理解析&#xf…

SSL安全证书多少钱?

SSL安全证书多少钱&#xff1f;单域名、多域名与通配符SSL证书的全面对比与价格分析。SSL&#xff08;Secure Sockets Layer&#xff09;证书作为一种加密技术&#xff0c;能够确保网站数据传输的安全性和可靠性&#xff0c;对于提升网站信誉和保护用户隐私具有至关重要的作用。…

【Spring】SpringBoot整合MybatisPlus的基本应用

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、MybatisPlus简介 先来看一下官方的简介吧。 MyBatis-Plus &#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为 简化开发、提高效率而生。Myb…

数据库:Redis数据库

一、非关系型数据库 1.什么是非关系型数据库 非关系型数据库&#xff08;Non-relational Database&#xff09;又称NoSQL数据库是一种不同于传统关系型数据库管理系统&#xff08;RDBMS&#xff09;的数据存储解决方案。NoSQL这个术语最初意味着"Not Only SQL"&…

php phar反序列化POC编写笔记

具体结构不细究&#xff0c;主要方便写poc代码&#xff0c;比如有如下文件内容&#xff1a; 文件内容如下&#xff1a; file base64.b64decode("PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8DQp9AQAAAQAAABEAAAABAAAAAABHAQAATzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZG…

外贸技巧:热衷开发却不精于追踪!这个误区害惨了外贸人...

很多外贸业务员热衷于开发客户&#xff0c;可对于后续的追踪却不能给予足够的重视。结果是开发的很辛苦&#xff0c;但后期却屡屡因为跟踪不积极&#xff0c;造成订单机会莫名其妙的就悄悄溜走了。 俗话说的好&#xff0c;一鸟在手胜过二鸟在林&#xff0c;而外贸业务员也需要…

JS-22-面向对象编程

一、一般的面向对象编程 当前&#xff0c;我们只使用Number、Array、string以及基本的{...}定义的对象&#xff0c;还无法发挥出面向对象编程的威力。 JavaScript的面向对象编程和大多数其他语言如Java、C#的面向对象编程都不太一样。 例如&#xff0c;Java、C#的面向对象编…

简单使用bootstrap-datepicker日期插件

目录 下载datepicker 方式一&#xff1a; 方式二&#xff1a; 下载依赖 下载bootstarp.js 下载jquery 使用示例 日期选择 单独选择年 单独选择月 单独选择日 设置截止日期 设置默认日期 总结 下载datepicker 方式一&#xff1a; 下载地址 GitHub - uxsolution…

Windows下编译TinyXML(XML文件解析)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 TinyXML是什么&#xff1f; TinyXML是一个轻量级的C XML解析器&#xff0c;它提供了一种简单的方法来解析和操作XML文档。TinyXM…

深入解析实时数仓Doris:Rollup上卷表与查询

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、基本概念二、Aggregate 和 Unique 模型中的 ROLLUP三、Duplicate 模型中的 ROLLUP四、ROLLUP 调整前缀索引五、ROLLUP使…

图解·Linux系统安装,手把手教你搞定操作系统!

这里博主使用了 VMware Workstation 16 Pro 版本&#xff08;不同版本可能略有差别&#xff09;从头到尾用图文搭配的模式给大家演示如何进行 Linux系统 的安装&#xff01;内容十分详尽&#xff0c;细节基本也到位了&#xff0c;可以说是保姆级教学了&#xff0c;希望对大家有…