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());
    }

}