Spring4筆記----AOP的環繞通知、切面的優先順序以及重用切入點定義
一、環繞通知
環繞通知是所有通知型別中功能最為強大的, 能夠全面地控制連線點. 甚至可以控制是否執行連線點.
對於環繞通知來說, 連線點的引數型別必須是 ProceedingJoinPoint . 它是 JoinPoint 的子介面, 允許控制何時執行, 是否執行連線點.
在環繞通知中需要明確呼叫 ProceedingJoinPoint 的 proceed() 方法來執行被代理的方法. 如果忘記這樣做就會導致通知被執行了, 但目標方法沒有被執行.
注意: 環繞通知的方法需要返回目標方法執行之後的結果, 即呼叫 joinPoint.proceed(); 的返回值, 否則會出現空指標異常
(1)環繞通知需要攜帶 ProceedingJoinPoint 型別的引數.
(2)環繞通知類似於動態代理的全過程: ProceedingJoinPoint 型別的引數可以決定是否執行目標方法.
且環繞通知必須有返回值, 返回值即為目標方法的返回值
二、指定切面的優先順序@Around("execution(* com..Spring4.AOP.*.*(..))") public Object aroundMethod(ProceedingJoinPoint pjd){ Object result = null; String methodName = pjd.getSignature().getName(); try { //前置通知 System.out.println("The method " + methodName + " begins with " + Arrays.asList(pjd.getArgs())); //執行目標方法 result = pjd.proceed(); //返回通知 System.out.println("The method " + methodName + " ends with " + result); } catch (Throwable e) { //異常通知 System.out.println("The method " + methodName + " occurs exception:" + e); throw new RuntimeException(e); } //後置通知 System.out.println("The method " + methodName + " ends"); return result; }
在同一個連線點上應用不止一個切面時, 除非明確指定, 否則它們的優先順序是不確定的.
切面的優先順序可以通過實現 Ordered 介面或利用 @Order 註解指定.
實現 Ordered 介面, getOrder() 方法的返回值越小, 優先順序越高.
若使用 @Order 註解, 序號出現在註解中
三、重用切入點定義
在編寫 AspectJ 切面時, 可以直接在通知註解中書寫切入點表示式. 但同一個切點表示式可能會在多個通知中重複出現.
在 AspectJ 切面中, 可以通過 @Pointcut 註解將一個切入點宣告成簡單的方法. 切入點的方法體通常是空的,
切入點方法的訪問控制符同時也控制著這個切入點的可見性. 如果切入點要在多個切面中共用, 最好將它們集中在一個公共的類中. 在這種情況下, 它們必須被宣告為 public. 在引入這個切入點時, 必須將類名也包括在內. 如果類沒有與這個切面放在同一個包中, 還必須包含包名.
其他通知可以通過方法名稱引入該切入點.
<strong> </strong> /**
* 定義一個方法, 用於宣告切入點表示式. 一般地, 該方法中再不需要添入其他的程式碼.
* 使用 @Pointcut 來宣告切入點表示式.
* 後面的其他通知直接使用方法名來引用當前的切入點表示式.
*/
@Pointcut("execution(public int com.Spring4.AOP.ArithmeticCalculator.*(..))")
public void declareJointPointExpression(){}
在通知註解中直接引用方法名即可@Before("declareJointPointExpression()")