1. 程式人生 > >Spring4筆記----AOP的環繞通知、切面的優先順序以及重用切入點定義

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()")