有时候我们希望记录某些方法的入参出参,但是有的时候切面可能把所有符合条件的切面的入参出参都记录了,没有很多的必要,有些方法记录入参出参没有过大的意义,所以我们可以利用注解 + AOP 实现针对注解方法的入参出参记录
注解类:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface LogParam {
}
AOP 拦截类:
/**
*@Description: 记录入参出参方法
*@Param:
*@Author: guanzhou.su, dont know what is mean? contact me at QQ:838951396, wechat:13824866769
*@Date: 2019/9/16
*@return:
*
**/
@Component
@Aspect
public class LogParamAop {
private static Logger logger = Logger.getLogger(LogParamAop.class);
@Pointcut("execution(* com.kds2.service.*.*(..))")
public void point() {
}
@Around("@annotation(logParam)")
public Object doAround(ProceedingJoinPoint pjp, LogParam logParam){
long startTime = System.currentTimeMillis();
Object obj = null;
//
try {
obj = pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
MethodSignature signature = (MethodSignature) pjp.getSignature();
String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
logger.info("LogParamAop==doAround==" + "method [" + methodName + "] spend time: "+(endTime-startTime)+"ms, inParam:" +
JSONObject.toJSONString(pjp.getArgs()) + "===outParam:" + (obj != null ?obj.toString():"null"));
return obj;
}
}
上面代码的 doAround 方法解释, 针对注解了 LogParam 的方法进行方法增强,执行完成之后, 使用 logger 记录入参出参信息(大家可以根据自己的情况存储到数据库等), 入参使用fastJson 转化成json字符串,我本来是使用 obj.toString的,但是发现是没办法输入对象字符串的,所以转化成json字符串是最好的方法