一、引入pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
二、创建切面类ServiceLogAspect.java
AOP通知
- 前置通知:在方法调用之前执行
- 后置通知:在方法正常调用之后执行(出错即不通知)
- 环绕通知:在方法调用之前和之后,都分别执行的通知
- 异常通知:如果在方法调用过程中发生异常,则通知
- 最终通知:在方法调用之后执行
切面表达式
- 第一处 * 代表方法返回类型 * 表示所有类型
- 第二处 包名 代表aop监控的类所在的包
- 第三处 . . 代表该包以及其子包下的所有类方法
- 第四处 * 代表类名,*代表所有类
- 第五处 *(. .) * 代表所有类中的方法,(. .)表示方法中的任何参数
@Around("execution(* com.test.service.impl..*.*(..))")
完整代码
package com.test.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 {
private static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class);
@Around("execution(* com.test.service.impl..*.*(..))")
public Object recodTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("======开始执行{}.{}=======",
joinPoint.getTarget().getClass(),
joinPoint.getSignature().getName());
long begin = System.currentTimeMillis();
Object result = joinPoint.proceed();
long end = System.currentTimeMillis();
long takeTime = end - begin;
if(takeTime > 3000){
log.error("=========执行结束,耗时:{}毫秒========",takeTime);
}else if(takeTime>2000){
log.warn("=========执行结束,耗时:{}毫秒========",takeTime);
}else{
log.info("=========执行结束,耗时:{}毫秒========",takeTime);
}
return result;
}
}