一、背景需求:

      数据类型特别多,需要实现对数据的操作是增删改查哪一种,如果每一个都进行编码,代码会冗余

二、实现代码

1、编写@DataChangeAnnotation注解,数据进行操作时,传入操作类型等需要编写日志的信息 

@Retention 元注解的作用就是负责注解其他注解

@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

  取值(ElementType)有:

    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@interface 用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataUpdateAnnotation {
    OperationType type();   //操作类型
    String detail() default "";//备注信息
    DataUrlEnum table() default DataUrlEnum.NULL;//根据枚举类获取数据的类型
}

操作类型  OperationType  用于判断数据的类型

public enum OperationType {
    ADD(1),UPDATE(3),DELETE(2);
    private Integer value;

    OperationType(Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }
}

3.实现保存日志逻辑

@Aspect
@Component
public class DataUpdateLog {
    @Autowired
    private DataDao dataDao;
    @Autowired
    private SocketUtil socketUtil;

    @Pointcut(value = "@annotation(com.***.DataUpdateAnnotation)")
    public void dataLog(){

    }
    @Around( "dataLog()")
    public Object doAfter(ProceedingJoinPoint joinPoint) throws Throwable {
        //从joinPoint中获取注解中设置的值
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        DataUpdateAnnotation annotation = method.getAnnotation(DataUpdateAnnotation.class);
        OperationType operationType = annotation.type();
        return "";
    }

}

4、注解使用  在serviceImpl的方法上,加上注解,并选择操作类型(增删改),和操作日志


@DataUpdateAnnotation(type = OperationType.ADD,table = DataUrlEnum.USER,detail = "插入数据")