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实现自动填充字段值的资料请关注脚本之家其它相关文章!

相关文章

  • IDEA生成servlet程序的实现步骤

    IDEA生成servlet程序的实现步骤

    这篇文章主要介绍了IDEA生成servlet程序的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 关于spring5的那些事:@Indexed 解密

    关于spring5的那些事:@Indexed 解密

    这篇文章主要介绍了关于spring5的那些事:@Indexed 解密,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java 详解Map集合之HashMap和TreeMap

    Java 详解Map集合之HashMap和TreeMap

    本章具体介绍了HashMap、TreeMap两种集合的基本使用方法和区别,图解穿插代码实现。 JAVA成仙路从基础开始讲,后续会讲到JAVA高级,中间会穿插面试题和项目实战,希望能给大家带来帮助
    2022-03-03
  • Spring框架应用的权限控制系统详解

    Spring框架应用的权限控制系统详解

    在本篇文章里小编给大家整理的是关于基于Spring框架应用的权限控制系统的研究和实现,需要的朋友们可以学习下。
    2019-08-08
  • Java数据结构之循环队列简单定义与用法示例

    Java数据结构之循环队列简单定义与用法示例

    这篇文章主要介绍了Java数据结构之循环队列简单定义与用法,简要描述了循环队列的概念、原理,并结合实例形式分析了java循环队列的定义与使用方法,需要的朋友可以参考下
    2017-10-10
  • Java线程安全和锁Synchronized知识点详解

    Java线程安全和锁Synchronized知识点详解

    在本篇文章里小编给大家分享的是关于Java线程安全和锁Synchronized相关知识点,有需要的朋友们可以参考下。
    2019-08-08
  • Java中BeanUtils.copyProperties的11个坑总结

    Java中BeanUtils.copyProperties的11个坑总结

    我们日常开发中,经常涉及到DO、DTO、VO对象属性拷贝赋值,很容易想到org.springframework.beans.BeanUtils的copyProperties,它会自动通过反射机制获取源对象和目标对象的属性,pyProperties,会有好几个坑呢,本文将给大家总结一下遇到的坑,需要的朋友可以参考下
    2023-05-05
  • Java springboot 配置文件与多环境配置与运行优先级

    Java springboot 配置文件与多环境配置与运行优先级

    这篇文章主要介绍了Java springboot如何配置文件,进行多环境配置,以及运行优先级,感兴趣的小伙伴可以借鉴一下
    2023-04-04
  • Spring @CrossOrigin 注解原理实现

    Spring @CrossOrigin 注解原理实现

    这篇文章主要介绍了Spring @CrossOrigin 注解原理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • mybatis plus 自动转驼峰配置小结

    mybatis plus 自动转驼峰配置小结

    SpringBoot提供两种配置Mybatis的方式,第一种是通过yml或application.properties文件开启配置,第二种是使用自定义配置类,通过给容器添加一个ConfigurationCustomizer来实现更灵活的配置,这两种方法可以根据项目需求和个人喜好选择使用
    2024-10-10

最新评论