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 mybatis-generator逆向工程生成代码

    IDEA mybatis-generator逆向工程生成代码

    这篇文章主要介绍了IDEA mybatis-generator逆向工程生成代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 解决SpringBoot打成jar运行后无法读取resources里的文件问题

    解决SpringBoot打成jar运行后无法读取resources里的文件问题

    这篇文章主要介绍了解决SpringBoot打成jar运行后无法读取resources里的文件问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • IDEA启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors解决办法

    IDEA启动报错Internal error. Please refer to https://jb.gg/i

    这篇文章主要介绍了IDEA启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • 详解spring cloud ouath2中的资源服务器

    详解spring cloud ouath2中的资源服务器

    这篇文章主要介绍了spring cloud ouath2中的资源服务器的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java常用加密算法实例总结

    Java常用加密算法实例总结

    这篇文章主要介绍了Java常用加密算法,结合实例形式总结分析了base64、md5、sha、rsa、des等加密算法实现技巧,需要的朋友可以参考下
    2017-10-10
  • java类的组成结构详解

    java类的组成结构详解

    大家好,本篇文章主要讲的是java类的组成结构详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Spring BeanName 的自动生成原理示例详解

    Spring BeanName 的自动生成原理示例详解

    这篇文章主要介绍了Spring BeanName 的自动生成原理示例详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java中forEach使用lambda表达式,数组和集合的区别说明

    Java中forEach使用lambda表达式,数组和集合的区别说明

    这篇文章主要介绍了Java中forEach使用lambda表达式,数组和集合的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java中的集合ArrayList类常用方法和遍历

    Java中的集合ArrayList类常用方法和遍历

    这篇文章主要介绍了Java中的集合ArrayList类常用方法和遍历,ArrayList 是大小可变的数组的实现,存储在内的数据称为元素,此类提供一些方法来操作内部存储的元素, ArrayList中可不断添加元素,其大小也自动增长,需要的朋友可以参考下
    2024-01-01
  • SpringBoot批处理的实现示例

    SpringBoot批处理的实现示例

    SpringBatch是一个开源 的、全面的、轻量级的批处理框架,通过SpringBoot可以实现强大的批处理应用程序开发,本文主要介绍了SpringBoot批处理的实现示例,感兴趣的可以了解一下
    2022-03-03

最新评论