这个有什么用呢?会检测你的系统哪些部分需要优化。
为什么要用这个呢?如果每一个方法都搞一个开始时间和结束时间,那么如果你的方法很多的话,这就行不通了,而且就算你不怕麻烦,那么测试之后,你还要一个一个的将这些删除,很费时间
1.因为需要用到 aop切面,所以在pom添加依赖:
<!--aop 切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
首先创建一个包 aspect,然后创建 ServiceLogAspect类:
package com.imooc.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ServiceLogAspect {
/**
* AOP通知:
* 1.前置通知: 在方法调用之前执行
* 2.后置通知: 在方法正常调用之后执行 (方法报异常,执行不了)
* 3.环绕通知: 在方法调用之前和之后,都分别可以执行的通知
* 4.异常通知:如果在方法调用过程中发生异常,则通知
* 5.最终通知:在方法调用之后执行
*/
public static final Logger log= LoggerFactory.getLogger(ServiceLogAspect.class);
/**
*
* 切面表达式:
* execution: 代表所要执行的表达式主题:
* 第一处: * 代表方法返回类型, *代表所有类型
* 第二处: 包名代表 aop 监控的类所在的包
* 第三处: ..代表代表该包以及其子包下的所有类方法
* 第四处: * 代表类名,*代表所有类
* 第五处: *(..) *代表类中的方法名,(..)表示方法中的任何参数
*
*
*
* @param joinPoint
* @return
* @throws Throwable
*/
//环绕通知
@Around("execution(* com.imooc.service.impl..*.*(..))")
public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("============开始执行 {}.{} ===========",
joinPoint.getTarget().getClass(),
joinPoint.getSignature().getName());//表明执行某个service类的某个方法
//记录开始时间
Long begin=System.currentTimeMillis();
//执行目标 service
Object result=joinPoint.proceed();
//记录结束时间
Long end=System.currentTimeMillis();
Long takeTime=end - begin ;
if (takeTime>3000){
log.error("========执行结束,耗时:{}毫秒========",takeTime);
}else if (takeTime>2000&&takeTime<3000){
log.warn("========执行结束,耗时:{}毫秒========",takeTime);
}else {
log.info("========执行结束,耗时:{}毫秒========",takeTime);
}
return result;
}
}