SpringBoot AOP,基于CGLib 动态代理实现
Jakcy
Java
2021-10-09
3
package com.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* AOP类
*/
@Slf4j
@Aspect
@Component
public class LogAspect {
/**
* 定义切点
*/
@Pointcut("execution(* com.conroller.*.*(..))")
public void log() {
}
/**
* 前置通知,做一些参数的预处理,不能阻止进入切点除非报错
*/
@Before("log()")
public void doBefore(JoinPoint joinPoint) {
log.info("Request : {}", Arrays.toString(joinPoint.getArgs()));
}
/**
* 后置通知,切点执行正常完成后执行。
*/
@AfterReturning(returning = "result", pointcut = "log()")
public void doAfterRutrun(Object result) {
log.info("Result : {}", result);
}
/**
* 异常通知,切点执行抛出异常后执行。
*/
@AfterThrowing(throwing = "ex", pointcut = "log()")
public void doAfterThrowing(Throwable ex) {
log.error("目标方法中抛出的异常 : ", ex);
}
/**
* 环绕通知
*/
@Around("log()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
log.debug("doAround:{}", joinPoint.getThis());
return joinPoint.proceed(joinPoint.getArgs());
}
/**
* 后置通知,切点执行后执行,就像 finally
*/
@After("log()")
public void doAfter(JoinPoint joinPoint) {
log.debug("doAfter : {}", joinPoint.getThis());
}
}