spring boot---aspect和三種攔截方式的比較
阿新 • • 發佈:2018-12-25
大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油,這個公眾號已經接入圖靈
程式碼配置
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