新人报道吖~~,第一次在这里分享,希望对大家有帮助,一直成长!
今日分享AOP
我们在写 web 项目时,请求内容日志记录对我们来说很重要,特别是出问题的要排查时,传的什么参数,返回内容都是我们排查的依据,那我们不可能每个controller上的每一个方法都打印log,对原有业务代码有侵入性,代码也冗余和繁琐。此时AOP就起到了重要作用。可以对业务无任何侵入。而本文实现用的@Around,如单词意思是围绕,就是包围着业务代码。那我们就可以在业务执行前获取请求参数打印,执行完成着结果打印,就实现我们的功能了。
建一个LogTraceHandlerAop文件,随便找个地方放下就可以。把
@Around 改成你的目标目录即可
LogTraceHandlerAop.java
@Slf4j
@Aspect
public class LogTraceHandlerAop {
// controller 下的所有方法
@Around("execution(* com.example.demo.controller..*.*(..))")
public Object doAround(ProceedingJoinPoint call) throws Throwable {
MethodSignature signature = (MethodSignature) call.getSignature();
Object[] args = call.getArgs();
if (args.length <= 0) {
return call.proceed();
}
Method method = signature.getMethod();
String methodName = method.getName();
String[] classNameArray = method.getDeclaringClass().getName().split("\\.");
String className = classNameArray[classNameArray.length - 1];
StringBuilder buffer = new StringBuilder();
for (Object arg : args) {
buffer.append(" ");
buffer.append(arg);
}
log.info("请求方法:{},请求参数:{}", className + "." + methodName, buffer.toString());
// 主要业务
Object result = call.proceed();
// 返回结果
String resJson = JSON.toJSONString(result);
log.info("请求返回结果{}", resJson);
return result;
}
}
离线