在日常开发中,我们经常需要记录一些操作日志;如果每个在方法里面写API,会比较麻烦;
故我们可以定义切面,来进行处理日志的记录;简化开发;
下面的案例是自定义注解来记入日志;可以根据自己的需求来改变自己的切面实现和连接点,
下面只是提供一个案例参考。
一、注解SaveLog
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SaveLog {
String operationFunction();
OperationType operationType();
String tableName();
}
操作枚举:
@AllArgsConstructor
@Getter
public enum OperationType {
SELECT, ADD, UPDATE, DELETE, COMPOSITE
}
配置类:
package com.javacode2018.aop.demo11.test1;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@ComponentScan //@1
@EnableAspectJAutoProxy //@2
public class MainConfig1 {
}
二、切面实现方法
@Aspect
@Component
@Slf4j
public class SaveLogAspect {
@AfterReturning(returning="result", pointcut="@annotation(SaveLog)", argNames = "joinPoint,result,SaveLog")
public void process(JoinPoint joinPoint,Object result, SaveLog saveLog) throws Throwable {
try {
Object[] args = joinPoint.getArgs();
String params = bulidLog(joinPoint.getArgs());
//记录日志的API 改成自己记录日志方法即可
OperationLog.saveLog(new OperationLog(saveLog.operationFunction(), saveLog.operationType(), params,result.toString(), saveLog.tableName(), "true"));
} catch (Exception e){
//log.info("SaveLogAspect",e);
}
}
public static String bulidLog(Object[] args){
String str = "";
for (int i = 0;i<args.length;i++) {
str += args[i] + ",";
}
String param = str.substring(0, str.lastIndexOf(","));
if (StringUtils.isEmpty(param)) {
return "";
} else {
return param;
}
}
}
三、实际使用
@SaveLog(operationFunction = "查询首页客户列表",operationType = OperationType.SELECT,tableName = "表明")
@GetMapping("/list/get")
public PageResultDomain getPageList(String token, QueryDTO domain) {
}