1. 程式人生 > >個人網站的搭建(六)——Spring之AOP

個人網站的搭建(六)——Spring之AOP

    之前已經配置好日誌系統,現在的想法是將頁面上每個請求的資訊都記錄下了。包括url,引數,返回值,執行時間等。

    我想到了spring的aop功能。

    一、理論準備

    一句話:切點通知切面。

    二、新建LogAspect.java

@Aspect
@Component
public class LogAspect {

    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);


    /**
     * @todo:    切點控制,所與的controller都要走這個切點
     */
    @Pointcut("execution( * com.byk..controller.*.*(..))")//兩個..代表所有子目錄,最後括號裡的兩個..代表所有引數
    public void logPointCut() {
    }


    /**
     * @todo:    前置通知    在logPointCut() 方法前進行通知
     */
    @Before("logPointCut()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到請求,記錄請求內容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 記錄下請求內容
        logger.info("請求地址 : " + request.getRequestURL().toString());
        logger.info("請求方式 : " + request.getMethod());
        logger.info("請求的類和方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "."
                + joinPoint.getSignature().getName());
        logger.info("引數 : " + Arrays.toString(joinPoint.getArgs()));

    }

    /**
     * @todo:   後置通知獲取返回值
     */
    @AfterReturning(returning = "ret", pointcut = "logPointCut()")// returning的值和doAfterReturning的引數名一致
    public void doAfterReturning(Object ret) throws Throwable {
        // 處理完請求,返回內容(返回值太複雜時,列印的是物理儲存空間的地址)
//        logger.debug("返回值 : " + ret.toString());
        logger.debug("返回值 : " + ret);
    }

    /**
     * @todo:   環繞通知監控方法時間
     */
    @Around("logPointCut()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object ob = pjp.proceed();// ob 為方法的返回值
        logger.info("耗時 : " + (System.currentTimeMillis() - startTime));
        return ob;
    }
}

    三、訪問

    啟動工程,瀏覽器訪問。

    控制檯輸出:

    

    日誌檔案記錄: