直接上代码:
/**
* 类名:常量类
* 用途:用于存储各类常量数据
*/
public class Constants {
public final static String UTIL_TRACER_INVOKE_METHOD_BEGIN = ">>>>>开始调用:"; //调用方法开始
public final static String UTIL_TRACER_INVOKE_METHOD_END = "<<<<<结束调用:"; //调用方法结束
public final static String UTIL_TRACER_INVOKE_METHOD_COST = ",总计耗时(毫秒):"; //调用方法耗时
}
/**
* 类名:LogTracer
* 用途:日志跟踪器,利用spring的aop打印方法调用的开始时间和结束时间,以及耗时。
*/
@Aspect //标注增强处理类(切面类)
@Component //交由Spring容器管理
@Slf4j
@Order(1) //设置优先级,值越低优先级越高
public class LogTracer {
/**
* 定义一个切入点.
*
* ~ 第一个 * 代表任意修饰符及任意返回值.
* ~ 第二个 * 任意包名
* ~ 第三个 * 代表任意方法.
* ~ 第四个 * 定义在web包或者子包
* ~ 第五个 * 任意方法
* ~ .. 匹配任意数量的参数.
*/
@Pointcut("execution(* com.had..*.*(..)) && !execution(* com.had.util..*.*(..))")
public void invokeLog(){}
/**
* 方法:在被调用方法的前后打印时间及耗时
* @param proceedingJoinPoint 处理连接点
* @return 被调用方法的处理结果
* @throws Throwable 异常
*/
@Around("invokeLog()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//打印当前时间
long startTime = System.currentTimeMillis();
//日志输出
log.info(Constants.UTIL_TRACER_INVOKE_METHOD_BEGIN + proceedingJoinPoint.toString());
//pjp.proceed()方法个人理解为是一个对业务方法的模拟,可是在这个方法前后插入想做的事情。
Object result = proceedingJoinPoint.proceed();
long finishTime = System.currentTimeMillis();
log.info(Constants.UTIL_TRACER_INVOKE_METHOD_END + proceedingJoinPoint.toString() + Constants.UTIL_TRACER_INVOKE_METHOD_COST + (finishTime-startTime) + "ms");
return result;
}
}
测试:
@RestController
public class HelloWorld1 {
@RequestMapping("/hello")
public Mono<String> test1(){
return Mono.just("hello!!!");
}
}
结果: