一、背景需求:
数据类型特别多,需要实现对数据的操作是增删改查哪一种,如果每一个都进行编码,代码会冗余
二、实现代码
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 = "插入数据")