首页 > 其他分享 >总结一下公共字段(aop加自定义注解加反射)

总结一下公共字段(aop加自定义注解加反射)

时间:2024-05-05 15:55:37浏览次数:21  
标签:getClass 自定义 arg value getDeclaredMethod aop 注解 LocalDateTime

应用场景

在一些业务类的创建中,我们需要反复对不同的类的同一个属性进行赋值,那么问题就出现了 **代码冗余**

如何解决呢

思路:利用aop创造一个切面

如何创造一个切面呢

实质上就是扫描加设置增强位置 那么如何扫描到对应的赋值方法上呢 这里需要用到自定义注解了 自定义注解:
//这里的OperationType 是定义的一个枚举类型,value是里面的枚举常量,在我们标识对应的方法中可以使用不同的常量来执行不同的判断
//表明作用对象是方法
@Target(value = ElementType.METHOD)
//运行时实现的,aop必写
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    OperationType value();
}

注解完成

注解完成,开始操刀aop切面


@Aspect//切面需要加的注解
@Component
@Slf4j
public class AutoFillAspect {
//这里标识,此切面的范围,也就是需要被增强的类,为了准确定位,我们还需要确认注解也在上面,使用poincut是为了减少冗余代码
  @Pointcut("execution(* com.sky.mapper.*.*(..))&&@annotation(com.sky.annotation.AutoFill)")
    public void autoFillPointcut(){}
//before在执行前进行一个增强的操作,参数基本都是JoinPoint
    @Before("autoFillPointcut()")
    public void autoFill(JoinPoint joinPoint){
    log.info("首位增强");
//通过参数获取签名
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//通过签名获取自定义注解的值
        AutoFill aution = signature.getMethod().getAnnotation(AutoFill.class);
        OperationType value = aution.value();
//通过参数获取对应的类
        Object[] args = joinPoint.getArgs();
        if(args.length==0||args== null){
            return;
        }
        Object arg = args[0];
//通过判断注解值后,getDeclaredMethod调用类里面的赋值方法
        if (value==OperationType.INSERT) {
            LocalDateTime updateTime = LocalDateTime.now();
            LocalDateTime createTime=LocalDateTime.now();
            Long createUser= BaseContext.getCurrentId();
            Long updateUser=BaseContext.getCurrentId();
            try {
                arg.getClass().getDeclaredMethod("setUpdateTime",updateTime.getClass());
                arg.getClass().getDeclaredMethod("setCreateTime",createTime.getClass());
                arg.getClass().getDeclaredMethod("setCreateUser",createUser.getClass());
                arg.getClass().getDeclaredMethod("setUpdateUser",updateUser.getClass());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }else if(value==OperationType.UPDATE){
            LocalDateTime updateTime = LocalDateTime.now();
            Long updateUser=BaseContext.getCurrentId();

            try {
                arg.getClass().getDeclaredMethod("setUpdateUser",updateUser.getClass());
                arg.getClass().getDeclaredMethod("setUpdateTime",updateTime.getClass());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}

标签:getClass,自定义,arg,value,getDeclaredMethod,aop,注解,LocalDateTime
From: https://www.cnblogs.com/fubai/p/18173556

相关文章

  • VScode自定义折叠代码快 region和endregion 关键字
    前言全局说明VScode自定义折叠代码快region和endregion关键字一、说明vscode有自带的代码折叠功能,但是因为某些内容不是标准的代码或不被识别就不能正常被折叠比如很多的单行注释,或者被注释的代码就能不能自动折叠。这里就要用到region和endregion关键字使用时r......
  • @EnableHystrix注解与@EnableCircuitBreaker的区别
    在学习服务降级中,发现了@EnableHystrix和@EnableCircuitBreaker的功能类似,研究后特此记录一下。查看@EnableHystrix的源码可以发现,它引用了@EnableCircuitBreaker,并对它进行了在封装。@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Document......
  • 浏览器中滚动条自定义
    浏览器中滚动条自定义在浏览器中,有的时候我们觉得滚动条很丑,或者不符合我们的审美,这时候我们就需要自定义滚动条。自定义滚动条可以让我们的网页看起来更加美观,也可以提高用户体验。要实现自定义滚动条,我们需要使用CSS样式。具体来说,我们可以使用::-webkit-scrollbar伪元素来定......
  • Spring AOP
    AOP简介A0P(AspectOrientedProgramming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(objectOrientedProgramming)面向对象编程作用:在不惊动原始设计的基础上为其进行功能增强Spring理念:无入侵式/无侵入式AOP核心概念连接点(JoinPoint):程序执行过程中的......
  • opencv中自定义的双线性二次插值的图像旋转及缩放
    #include<iostream>#include<opencv2/opencv.hpp>usingnamespacecv;usingnamespacestd;voidcoordinateTransform(Point2d*p4Corner,Point2d*np4Corner,doublerotAngle,doublegamma,Point2dcenter){doublecx=center.x,cy=center.y;doubl......
  • springboot+MDCAdapter自定义starter实现日志全链路追踪
    MDCMDC(MappedDiagnosticContext,映射调试上下文)是日志系统提供的一种方便在多线程条件下记录日志的功能使用场景一个常用的场景就是Web服务器中给每个请求都分配一个独特的请求id,所有的日志都会打印这个请求id,这样一个请求下的所有日志信息都可以很方便的找到。欢迎关注个人公......
  • 使用Colab_LLaMA_Factory_LoRA微调_Llama3(可自定义数据)
    使用LLaMAFactory微调Llama-3中文对话模型项目主页: https://github.com/hiyouga/LLaMA-Factory这个过程超级简单,半个多小时在T4上就能跑完。完全可以替换成自己的数据,支持中文数据。安装LLaMAFactory依赖 1%cd/content/2%rm-rfLLaMA-Factory3!gitclo......
  • Java注解和反射
    元注解:负责注解其他的注解,Java定义了4个标准的meta-annotation类型@Target:用于描述注解的适用范围@Retention:表示需要再什么级别保存该注解信息,用于描述注解的生命周期(source<class<runtime)@Document:该注解江北包含在javadoc中@Inherited:说明子类可以继承父类中的注解自......
  • Spring注解开发
    配置bean在类的上方一个注解:@Component,就表示配置了该类@Component("该类的名称,可以省略不写")publicclassDaoImplimplementsDao{ publicvoidshow(){ }}在xml配置文件中,添加扫描注解的配置#base-package表示要扫描的包<context:component-scanbase-package="......
  • 从自定义一个作用域开始来了解SpringBean的作用域
    你好,这里是codetrend专栏“Spring6全攻略”。在Spring框架中,Bean的作用域(Scope)定义了Bean实例在容器中如何创建、管理和销毁的策略。Spring提供了多种Bean作用域,每种作用域都有其特定的生命周期和适用场景。先试试不同的BeanScope下面通过一个简单的SpringMVCCon......