java Aop实现自动填充字段值示例

 更新时间:2023年09月12日 10:06:54   作者:留胡子的饼干  
这篇文章主要为大家介绍了Aop实现自动填充字段值示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

需求

自动填充更新时间创建时间,创建用户和更新用户。

自定义注解

OperationType类是一个枚举

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill{
    OperationType value();
}

OperationType枚举类

/**
 * 数据库操作类型
 */
    public enum OperationType {
/**
 * 更新操作
 */
    UPDATE,
/**
 * 插入操作
 */
    INSERT
}

使用aop并且声明一个事务

package com.sky.aspect;
import com.sky.annotation.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
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.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.util.Objects;
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
public void pt() {
}
@Before("pt()")
public void autoFill(JoinPoint joinPoint) {
    //获取签名对象
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    //获取方法上注解
    AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);
    OperationType value = annotation.value();
    //解析注解是增加还是更新
    Object[] args = joinPoint.getArgs();
    if (Objects.isNull(args) || args.length == 0) {
        return;
    }
    Object target = args[0];
    LocalDateTime now = LocalDateTime.now();
    Long currentId = BaseContext.getCurrentId();
    Class<?> clazz = target.getClass();
    if (value == OperationType.INSERT) {
        try {
            Method setCreateTimeMethod = clazz.getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
            Method setCreateUserMethod = clazz.getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
            setCreateTimeMethod.invoke(target,now);
            setCreateUserMethod.invoke(target,currentId);
            autoFillUpdateMethod(now,currentId,clazz,target);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else if (value == OperationType.UPDATE) {
        try {
            autoFillUpdateMethod(now,currentId,clazz,target);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
private void autoFillUpdateMethod(LocalDateTime now, Long id, Class<?> clazz, Object target) throws Exception {
    Method setUpdateTimeMethod = clazz.getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
    Method setUpdateUserMethod = clazz.getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
    setUpdateTimeMethod.invoke(target,now);
    setUpdateUserMethod.invoke(target,id);
}

以上就是Aop实现自动填充字段值的详细内容,更多关于Aop实现自动填充字段值的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Spring Batch实现批处理任务的详细教程

    使用Spring Batch实现批处理任务的详细教程

    在企业级应用中,批处理任务是不可或缺的一部分,它们通常用于处理大量数据,如数据迁移、数据清洗、生成报告等,Spring Batch是Spring框架的一部分,本文将介绍如何使用Spring Batch与SpringBoot结合,构建和管理批处理任务,需要的朋友可以参考下
    2024-06-06
  • Java 单例模式的实现资料整理

    Java 单例模式的实现资料整理

    这篇文章主要介绍了Java 单例模式的实现的相关资料,并附简单实例代码,需要的朋友可以参考下
    2016-10-10
  • SpringBoot JS-SDK自定义微信分享的实现

    SpringBoot JS-SDK自定义微信分享的实现

    这篇文章主要介绍了SpringBoot JS-SDK自定义微信分享的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Spark 集群执行任务失败的故障处理方法

    Spark 集群执行任务失败的故障处理方法

    这篇文章主要为大家介绍了Spark 集群执行任务失败的故障处理方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • SpringCloud之Config配置中心与Redis分布式锁详解

    SpringCloud之Config配置中心与Redis分布式锁详解

    这篇文章主要给大家介绍了SpringCloud Alibaba中Config配置中心,Redis分布式锁,文中有详细的代码示例供大家参考,需要的朋友可以参考阅读
    2023-05-05
  • Mybatis执行SQL时多了一个limit的问题及解决方法

    Mybatis执行SQL时多了一个limit的问题及解决方法

    这篇文章主要介绍了Mybatis执行SQL时多了一个limit的问题及解决方法,Mybatis拦截器方法识别到配置中参数supportMethodsArguments 为ture时会分页处理,本文结合示例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-10-10
  • Java中字符串和byte数组之间的简单转换方法

    Java中字符串和byte数组之间的简单转换方法

    这篇文章主要给大家介绍了关于Java中字符串和byte数组之间的简单转换方法,Java中将String类型转换为byte[]类型,可以使用String的getBytes()方法,还有很多其他的办法,需要的朋友可以参考下
    2023-08-08
  • Java-web中利用RSA进行加密解密操作的方法示例

    Java-web中利用RSA进行加密解密操作的方法示例

    这篇文章主要给大家介绍了关于在Java-web中利用RSA进行加密解密操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • 详解Java编程中向量(Vector)的应用

    详解Java编程中向量(Vector)的应用

    这篇文章主要介绍了Java中的向量(Vector)的应用,Vector也是Java中比较常用的一个类,需要的朋友可以参考下
    2015-10-10
  • Java版数据结构插入数据时遇到的结点为空的问题详解

    Java版数据结构插入数据时遇到的结点为空的问题详解

    这篇文章主要介绍了Java版数据结构插入数据时遇到的结点为空的问题及解决办法,需要的朋友们可以学习下。
    2019-09-09

最新评论