Sping值AOP实战

不废话,贴代码

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.jxzx.yqby.base.JsonResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@Slf4j
@Component
@Aspect
public class FriendChainAspect {

    @Value("${aspect.log.value:}")
    private String logAspect;

    private final String logValue="log";
    /**
     * 切入点:待增强的方法
     * 切入点签名
     */
    @Pointcut("execution(public * org.jxzx.phjr.api.controller.friend.*.*(..))")
    public void log() {
        if (!logValue.equals(logAspect)) {
            return;
        }
        System.out.println("pointCut签名。。。");
    }

    /**
     * 前置通知
     *
     * @param jp
     * @throws Throwable
     */
    @Before("log()")
    public void deBefore(JoinPoint jp) throws Throwable {
        if (!logValue.equals(logAspect)) {
            return;
        }
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        System.out.println("URL : " + request.getRequestURL().toString());
        System.out.println("HTTP_METHOD : " + request.getMethod());
        System.out.println("CLASS_METHOD : " + jp);
        System.out.println("ARGS : " + Arrays.toString(jp.getArgs()));
    }

    /**
     * 返回通知
     *
     * @param ret
     * @throws Throwable
     */
    @AfterReturning(returning = "ret", pointcut = "log()")
    public void doAfterReturning(Object ret) throws Throwable {
        if (!logValue.equals(logAspect)) {
            return;
        }
        // 处理完请求,返回内容
        if (ret instanceof JsonResult) {
            JsonResult chain = (JsonResult) ret;
            log.info("请求返回的code = {}", JSON.toJSONString(chain.getErrCode()));
            log.info("请求返回的httpCode = {}", JSON.toJSONString(chain.getHttpCode()));
            log.info("请求返回的message = {}", JSON.toJSONString(chain.getErrMessage()));
            log.info("请求返回的status = {}", JSON.toJSONString(chain.getStatus()));
            log.info("请求返回的信息 = {}", JSON.toJSONString(chain.getData()));
        }
    }

    /**
     * 异常通知
     *
     * @param jp
     * @param ex
     */
    @AfterThrowing(throwing = "ex", pointcut = "log()")
    public void throwss(JoinPoint jp, Exception ex) {
        if (!logValue.equals(logAspect)) {
            return;
        }

        System.out.println("异常通知:方法异常时执行.....");
        System.out.println("产生异常的方法:" + jp);
        System.out.println("异常种类:" + ex);
    }

    /**
     * 后置通知
     *
     * @param jp
     */
    @After("log()")
    public void after(JoinPoint jp) {
        if (!logValue.equals(logAspect)) {
            return;
        }

        System.out.println("后置通知:最后且一定执行.....");
    }

    /**
     * 环绕通知,环绕增强,相当于MethodInterceptor
     *
     * @param pjp
     * @return
     */
    @Around("log()")
    public Object aroundAdvice(ProceedingJoinPoint pjp) {

        Object rtValue = null;
        try {
            //得到方法执行所需的参数
            Object[] args = pjp.getArgs();
            if (logValue.equals(logAspect)) {
                System.out.println("通知类中的aroundAdvice方法执行了。。前置");
            }
            //明确调用切入点方法(切入点方法)
            rtValue = pjp.proceed(args);

            if (!logValue.equals(logAspect)) {
               return rtValue;
            }

            System.out.println("通知类中的aroundAdvice方法执行了。。返回");
            System.out.println("返回通知:" + rtValue);

            return rtValue;
        } catch (Throwable e) {
            System.out.println("通知类中的aroundAdvice方法执行了。。异常");
            throw new RuntimeException(e);
        } finally {
            System.out.println("通知类中的aroundAdvice方法执行了。。后置");
        }
    }

}