今天小編就爲大家分享一篇關於SpringBoot AOP使用筆記,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
1. 啓用AOP
a. 在類上添加@Aspect註解
b. 注入該類, 可以使用@Component進行注入到Spring容器中
2. 通過PointCut對象創建切入點
a. 在某個方法使用類似下面的方法進行注入
@Pointcut("execution(* com.sguess.service.IAOPService.*(..))") private void pointcut() { }
i. 其中,execution表達式爲
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
ii. 注意, pointcut()方法名是後面切入的時候需要使用的
iii. 方法內可以什麼也不寫, 寫了也調不到
iv. 也可以創建多個PointCut,例如再創建一個
@Pointcut("execution(* com.sguess.service.IAOPService.fun1(..))") private void pointcut2() { }
這個的方法名就位pointcut2, 方法名不一樣.
b. 創建After方法,Before方法
@After(value = "pointcut()") public void doAfter() { System.out.println("Do AOP After function 01"); }
i. After方法是指, 在配置了的切入點被執行後, 執行該方法.
ii. value中的pointcut() 是我們前面在創建@Pointcut中的方法名. 也就是說,是通過方法名和切入點進行匹配的.
iii. 這個的方法名可以隨便起.
iv. Before方法同理
c. 帶Return的After方法,
@AfterReturning(returning = "str", pointcut = "pointcut()") public void doAfterReturning(String str) throws Exception { System.out.println("Return value is: " + str); }
i. AfterReturn是指在被切入的方法執行後, 獲取其返回值, 再執行該方法. 注意關鍵, 這個可以進行操作返回值.
ii. returning = "str",是指, 假設切入方法的返回的值變量名爲str
doAfterReturning(String str)方法的參數變量名必須和和returning保持一致, 這裏也叫作str. 然後才能在方法體中使用.
iii. pointcut = "pointcut()"同樣是指前面聲明的pointcut方法名
3. 通過註解, 使用切入點
a. 監聽方法參數
@Before("execution(public int com.sguess.service.*(int, int))") public void beforMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args); } @After("execution(public int com.sguess.service.*(int, int))") public void afterMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args); }
4. 執行順序:
a.Around的方法優先於Before/After執行,After優先於AfterReturn.
i. 代碼
@Before("execution(public int com.sguess.service.*.*(int, int))") public void beforMethod(JoinPoint point) { System.out.println("Before function"); } @After("execution(public int com.sguess.service.*.*(int, int))") public void afterMethod(JoinPoint point) { System.out.println("After function"); } @AfterReturning("execution(public int com.sguess.service.*.*(int, int))") public void afterReturnMethod(JoinPoint point) { System.out.println("AfterReturn function"); } @AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e") public void afterReturningThrowing(JoinPoint point, Exception e) { System.out.println("AfterReturnThrowing function"); } @Around("execution(public int com.sguess.service.*.*(int, int))") public Object aroundMethod(ProceedingJoinPoint pdj) { System.out.println("Start AroundFunction"); Object result = null; try { System.out.println("Around process start"); result = pdj.proceed(); System.out.println("Around process end"); } catch (Throwable e) { System.out.println("Around process exception"); } System.out.println("After Around process"); return result; } }
執行結果:
Start AroundFunction
Around process start
Before function
Around process end
After Around process
After function
AfterReturn function
5.小結:
@AfterReturning(returning = "str", pointcut = "pointcut()") public void doAfterReturning(String str) throws Exception { System.out.println("Return value is: " + str); } @Before("execution(public int com.sguess.service.*.*(int, int))") public void beforMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args); } @After("execution(public int com.sguess.service.*.*(int, int))") public void afterMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args); } @AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e") public void afterReturningThrowing(JoinPoint point, Exception e) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("AfterReturningThrowing FunctionName:" + methodName + ",ParameterName:" + args + ",Exception:" + e); } @Around("execution(public int com.sguess.service.*.*(int, int))") public Object aroundMethod(ProceedingJoinPoint pdj) { System.out.println("Start AroundFunction"); Object result = null; try { System.out.println("Around process start"); result = pdj.proceed(); System.out.println("Around process end"); } catch (Throwable e) { System.out.println("Around process exception"); } System.out.println("After Around process"); return result; }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對神馬文庫的支持。如果你想了解更多相關內容請查看下面相關鏈接