首页 > 其他分享 >Spring AOP 实现《自动自动填充Entity》

Spring AOP 实现《自动自动填充Entity》

时间:2024-03-28 13:47:49浏览次数:12  
标签:invoke setUpdateUser Spring Entity entity 自动 getDeclaredMethod null class

定义注解

AutoFill.java

/**
 * 自定义注解,实现自动填填充功能
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    OperationType value() default  OperationType.INSERT;
}

定义AOP

AutoFillAspect.java

@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    /**
     * 定义切点
     */
    @Pointcut(value = "execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.aspect.annotation.AutoFill)")
    public void autoFillPointCut(){}
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint){
        log.info("开始自动填充autoFill");
        //获取到当前被拦截的方法上的数据库操作类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法签名对象
        AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);//获取方法上的注解对象
        OperationType operationType = annotation.value();//获取注解上自定义的操作类型

        //获取注解上的参数
        Object[] args = joinPoint.getArgs();
        if(args == null || args.length == 0) return ;

        Object entity = args[0] ;

        LocalDateTime nowTime = LocalDateTime.now(); //当前时间
        Long currentId = BaseContext.getCurrentId(); // 当前登录用户Id

        if(operationType == OperationType.INSERT){ //插入操作
            try {
                Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                //通过反射赋值
                if(setCreateTime!=null){
                    setCreateTime.invoke(entity,nowTime);
                }
                if(setUpdateTime!=null){
                    setUpdateTime.invoke(entity,nowTime);
                }
                if(setUpdateUser!=null){
                    setUpdateUser.invoke(entity,currentId);
                }
                if(setCreateUser!=null){
                    setCreateUser.invoke(entity,currentId);
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }else if(operationType == OperationType.UPDATE){
             try {
                 Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                 Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
                 if(setUpdateTime!=null){
                     setUpdateTime.invoke(entity,nowTime);
                 }
                 if(setUpdateUser!=null){
                     setUpdateUser.invoke(entity,currentId);
                 }

             }catch (Exception ex){
                 ex.printStackTrace();
             }
        }
    }
}

枚举


/**
 * 数据库操作类型
 */
public enum OperationType {

    /**
     * 更新操作
     */
    UPDATE,

    /**
     * 插入操作
     */
    INSERT

}

标签:invoke,setUpdateUser,Spring,Entity,entity,自动,getDeclaredMethod,null,class
From: https://www.cnblogs.com/paylove/p/18101456

相关文章

  • SpringCloud(三)统一网关 -- GateWay
    gateway官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 我们为什么选择Gatway?:neflix不太靠谱,zuul2.0一直跳票,迟迟不发布​一方面因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,......
  • SpringBoot冬奥会科普平台系统设计与实现毕设(文档+源码)
    目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot冬奥会科普平台系统,项目源码请点击文章末尾联系我哦~目前有各类成品毕设JavaWeb SSMSpringBoot等等......
  • 计算机java项目|Springboot基于Hadoop的物品租赁系统的设计与实现
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • springboot/ssm城乡居民基本医疗信息管理系统Java医院挂号问诊系统web
    springboot/ssm城乡居民基本医疗信息管理系统Java医院挂号问诊系统web基于springboot(可改ssm)+vue项目开发语言:Java框架:springboot/可改ssm+vueJDK版本:JDK1.8(或11)服务器:tomcat数据库:mysql5.7(或8.0)数据库工具:Navicat/sqlyog开发软件:eclipse//idea依赖管理包:Mave......
  • Elasticsearch入门及常用命令和Spring中的常用操作
    入门官网简介一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索。搜索速度快,可以提供实时的搜索服务。便于水平扩展,每秒可以处理PB级海量数据。常用术语索引:与MySQL数据库中的Database相对应类型:与MySQL数据库中的Table相对应文档:相当于MySQL中的一......
  • SpringCloud微服务集成Dubbo
    1、Dubbo介绍ApacheDubbo是一款易用、高性能的WEB和RPC框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生......
  • 《自动机理论、语言和计算导论》阅读笔记:p49-p67
    《自动机理论、语言和计算导论》学习第4天,p49-p67总结,总计19页。一、技术总结1.DeterministicFiniteAutomata(DFA)vsNondeterministicFiniteAutomata(NFA)(1)DFA定义(2)NFA定义A"nonedeterministic"finiteautomatahasthepowertobeinseveralstatesatonce......
  • 1、Spring CLI 简介
    SpringCLISpringCLI的目标是在你创建新项目或为现有项目添加功能时提高你的工作效率。以下是它的一些主要特点:bootnew命令bootnew命令允许你克隆一个外部项目,并可以选择对包名进行重构,以适应你选择的包名。此外,你还可以选择指定新项目的组ID、构件ID和版本。boot......
  • 面试官:说说Spring中IoC实现原理?
    IoC(InversionofControl)即控制(权)反转,它是一种编程思想,它的核心理念是将对象的创建和管理权力从对象本身转移到外部的容器或框架。IoC的主要目的是降低代码之间的耦合度,提高代码的重用性、可测试性和灵活性。在IoC模式下,对象不需要自己创建或者查找它们所依赖的对象,这些工作由......
  • springboot 集成elasticsearch Ik分词
    前提是我们elasticsearch服务已经集成了IK分词,具体集成下载对应的elasticsearchIK分词插件,在es插件包下创建IK文件夹,将下载好的IK包上传上去解压后重启es1、pom引入co.elastic.clientselasticsearch-java7.16.2jakarta.jsonjakarta.json-api2.0.1org.springframew......