环绕通知
環繞通知
環繞通知是所有通知類型中功能最為強大的, 能夠全面地控制連接點. 甚至可以控制是否執行連接點.
對于環繞通知來說, 連接點的參數類型必須是 ProceedingJoinPoint . 它是 JoinPoint 的子接口, 允許控制何時執行, 是否執行連接點.
在環繞通知中需要明確調用 ProceedingJoinPoint 的 proceed() 方法來執行被代理的方法. 如果忘記這樣做就會導致通知被執行了, 但目標方法沒有被執行.
注意: 環繞通知的方法需要返回目標方法執行之后的結果, 即調用 joinPoint.proceed(); 的返回值, 否則會出現空指針異常
package com.learn.spring.aspectJ;import java.util.Arrays;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;/*** 日志切面*/ @Component //標識為組件 @Aspect //標識為切面 @Order(3) //指定切面的優先級. 值越小,優先級越高. 標注@Order的切面比不標注@Order切面的優先級高 public class LoggingAspect {/*** 環繞通知:類似于動態代理的整個過程.*///@Around("execution(* com.learn.spring.aspectJ.*.*(..))")public Object aroundMethod(ProceedingJoinPoint pjp){String methodName = pjp.getSignature().getName();Object [] args = pjp.getArgs();try {System.out.println("The method "+methodName+" begins with " +Arrays.asList(args));//執行目標方法Object result = pjp.proceed();System.out.println("The method "+methodName+" ends with " +result );return result ;} catch (Throwable e) {e.printStackTrace();System.out.println("The method "+methodName+"occurs exception :" + e );}finally{System.out.println("The method " + methodName+"ends .");}return null ;}}?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結