简单的AOP 切面做方法耗时 用来追踪方法的执行时长,有缺点可以补充
package com.jinzhu.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
* AOP 切面 log日志 用来监控service 层执行的时间
*/
@Component
@Aspect
@Slf4j
public class ServiceLogAspect {
/**
* 切面表达式 环绕通知
* @exception 代表所执行的表达式
* 第一处 * 代表方法返回类型 *是代表所有类型
* 第二处 com.jinzhu.service.impl 包名代表app监控的类所在包
* 第三处 。。 代表该包以及其子包下的所有方法
* 第四处 * 类名 * 是所有类名
* 第五处 *(..) *代表类中的所有方法,(..) 表示方法中任何参数
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
@Around("execution(* com.jin.service.impl..*.*(..))")
public Object timeLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//找到执行的那个service层 proceedingJoinPoint 里面有最追踪那个层的结果 也就是测试的某个类
//proceedingJoinPoint.getTarget().getClass() 某个service
//proceedingJoinPoint.getSignature().getName() 的方法
log.info("=====开始执行--{}.{}=====", proceedingJoinPoint.getTarget().getClass(),
proceedingJoinPoint.getSignature().getName());
//开始时间
long sta = System.currentTimeMillis();
//执行目标的service
Object proceed = proceedingJoinPoint.proceed();
//结束时间
long end = System.currentTimeMillis();
long tikeTime = end - sta;
log.info("====执行结束,耗时:{}毫秒 ====", tikeTime);
return proceed;
}
}