一、引包
<!-- AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
二、使用
/**
* 切面处理AOP类
* 执行顺序:around > before > around > after > afterReturning
*
* @author yangzihe
* @date 2021/12/14
*/
@Component
@Aspect //切面声明
@Slf4j
public class ApiAspect {
/**
* 切入点配置:方法类型 方法返回值 包名.类名.方法名(参数类型)
*/
@Pointcut("execution(public * yzh.controller.*.*(..))")
public void apiPointCut() {}
/**
* 环绕通知:在被通知的方法调用之前和调用之后执行自定义的方法
* 用途:全局异常的统一处理
*/
@Around("apiPointCut()")
public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
log.info("执行前-->");
long startTime = System.currentTimeMillis();
Object result;
try {
result = proceedingJoinPoint.proceed();
} catch (IllegalArgumentException e) {
result = e.getMessage();
} catch (RuntimeException e) {
result = e.getMessage();
} catch (Throwable e) {
result = "系统级别异常";
}
log.info("执行后-->花费时间:{}ms", System.currentTimeMillis() - startTime);
return result;
}
/**
* 异常通知:在目标方法抛出异常之后调用,增强异常处理,处理后异常仍然会往上一级调用者传播
* 注:使用异常通知,不会吃掉异常,异常会向上继续传递给调用者。
*
* @param joinPoint 接入点
* @param exception 异常
*/
@AfterThrowing(value = "apiPointCut()", throwing = "exception")
public void afterThrowingAdvice(JoinPoint joinPoint, Throwable exception) {
log.error("方法执行异常, 方法名:{}", joinPoint.getSignature().getName(), exception);
}
/**
* 前置通知:在目标方法调用之前调用通知
*/
@Before("apiPointCut()")
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println("beforeAdvice...");
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
log.info("URL : {}, HTTP_METHOD:{}, CLASS_METHOD : {}",
request.getRequestURL().toString(), request.getMethod(),
joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
}
/**
* 后置通知:在目标方法完成之后调用通知
*/
@After("apiPointCut()")
public void afterAdvice() {
System.out.println("afterAdvice...");
}
/**
* 返回通知:在目标方法成功执行之后调用通知
*
* @param joinPoint
* @param returnObject
*/
@AfterReturning(value = "apiPointCut()", returning = "returnObject")
public void afterReturning(JoinPoint joinPoint, Object returnObject) {
System.out.println("afterReturning...");
}
}