aop log切面

@Aspect:描述一個切面類,定義切面類的時候須要打上這個註解java

@Component:spring-boot配置類web

 

package com.*.*.tools;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
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;

@Aspect
@Component
public class LogAspect {

    /**
     * 功能描述: 攔截對這個包下全部方法的訪問
     *
     * @param:[]
     * @return:void
     **/
    @Pointcut("execution(* com.*.*.controller.*..*(..))")
    public void loginLog() {
    }

    // 前置通知
    @Before("loginLog()")
    public void loginBefore(JoinPoint joinPoint) {

        // 咱們從請求的上下文中獲取request,記錄請求的內容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = attributes.getRequest();

        System.out.println("請求路徑 : " + request.getRequestURL());
        System.out.println("請求方式 : " + request.getMethod());
        System.out.println("方法名 : " + joinPoint.getSignature().getName());
        System.out.println("類路徑 : " + joinPoint.getSignature().getDeclaringTypeName());
        System.out.println("參數 : " + Arrays.toString(joinPoint.getArgs()));
    }

//    @AfterReturning(returning = "object", pointcut = "loginLog()")
//    public void doAfterReturning(Object object) {
//
//        System.out.println("方法的返回值 : " + object);
//    }

    // 方法發生異常時執行該方法
    @AfterThrowing(throwing = "e",pointcut = "loginLog()")
    public void throwsExecute(JoinPoint joinPoint, Exception e) {

        System.err.println("方法執行異常 : " + e.getMessage());
    }

    // 後置通知
//    @After("loginLog()")
//    public void afterInform() {
//
//        System.out.println("後置通知結束");
//    }

    // 環繞通知
    @Around("loginLog()")
    public Object surroundInform(ProceedingJoinPoint proceedingJoinPoint) {

        long startTime=System.currentTimeMillis();
        try {
            Object o =  proceedingJoinPoint.proceed();
            long times=System.currentTimeMillis()-startTime;
            MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
            String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
            System.out.println("【"+methodName+"】執行時間:" +times/1000+"s" );
            return o;
        } catch (Throwable e) {
            e.printStackTrace();
            return null;
        }
    }
}
相關文章
相關標籤/搜索