依赖
<!--添加依赖-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!--aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
注解
@Retention(RetentionPolicy.RUNTIME) // 保留到运行阶段
@Target({ElementType.METHOD}) // 只能加方法上
public @interface LogAnno {
String methodDesc() default ""; // 方法用途
}
实现:
// 记录日志的切面
@Aspect
@Component
public class LogAspect {
@Autowired
private HttpServletRequest request;
@Autowired
private OperateLogMapper operateLogMapper;
// 切点 (标注LogAnno注解的方法都被切中)
@Pointcut("@annotation(com.itheima.anno.LogAnno)")
public void pt() {
}
// 环绕通知
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
OperateLog operateLog = new OperateLog();
// 获取类名
operateLog.setClassName(pjp.getTarget().getClass().getName());
// 获取方法参数
operateLog.setMethodParams(Arrays.toString(pjp.getArgs()));
// org.aspectj.lang.reflect.MethodSignature
MethodSignature ms = (MethodSignature) pjp.getSignature();
// 获取方法名
operateLog.setMethodName(ms.getMethod().getName());
LogAnno logAnno = ms.getMethod().getAnnotation(LogAnno.class);
// 获取方法描述
operateLog.setMethodDesc(logAnno.methodDesc());
String token = request.getHeader("token");
Claims claims = JwtUtils.parseJWT(token);
// 拿到用户id
Integer id = claims.get("id", Integer.class);
operateLog.setOperateUser(id);
// 操作时间
operateLog.setOperateTime(LocalDateTime.now());
long begin = System.currentTimeMillis();
Object object = pjp.proceed();
long end = System.currentTimeMillis();
// 方法执行时间
operateLog.setCostTime(end - begin);
// 方法返回信息
operateLog.setReturnValue(object.toString());
// 落库
operateLogMapper.insert(operateLog);
return object;
}
}