1. 程式人生 > >spring boot---aspect和三種攔截方式的比較

spring boot---aspect和三種攔截方式的比較

大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油,這個公眾號已經接入圖靈https://img-blog.csdnimg.cn/20181129224604602.png

程式碼配置

package com.zzh.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SoutParamPoint {

   // 切入 任意的返回型別  com.zzh.controller下的任意類的任意方法
   @Around("execution(* com.zzh.controller.*.*(..))")
   public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
      System.out.println("進入切面");
      Object[] args = pjp.getArgs();

      System.out.println("aop--輸出引數值");
      for (Object o : args){
         System.out.println(o.toString());
      }
      //執行攔截到的方法
      Object proceed = pjp.proceed();
      //返回值
      return proceed;
   }
}

@Befor(前置通知)
在方法呼叫之前 呼叫

@After(後置通知)
在方法返回之後呼叫

@Afterthrow
在方法出現異常後呼叫

@Around
環繞通知
優點:
1) 目標方法的呼叫由環繞通知決定,即你可以決定是否呼叫目標方法,而前置和後置通知   是不能決定的,他們只是在方法的呼叫前後執行通知而已,即目標方法肯定是要執行的。

2)  環繞通知可以控制返回物件,即你可以返回一個與目標物件完全不同的返回值,雖然這很危險,但是你卻可以辦到。而後置方法是無法辦到的,因為他是在目標方法返回值後呼叫

三種攔截的區別

filter 可以得到 請求和響應 但是拿不到 方法的資訊
interceptor 可以得到 請求和響應 也能拿到方法的資訊 但是拿不到引數
aspect     可以拿到方法的資訊和引數 但是拿不到請求和響應

順序  
正常時過濾器 攔截器 切片(aspect)
異常時  切片(如果丟擲)->ControllerAdvice->interceptor->filter