1. 前置通知
實現org.springframework.aop.MethodBeforeAdvice接口的before方法,該方法接受三個參數:被調用的方法、傳給該方法的參數和目標對象。
- public class SimpleBeforeAdvice implements MethodBeforeAdvice {
- public static void main(String[] args) {
- MessageWriter target = new MessageWriter();
-
- ProxyFactory pf = new ProxyFactory();
- pf.setTarget(target);
-
- MessageWriter proxy = (MessageWriter) pf.getProxy();
-
- proxy.writeMessage();
- }
- public void before(Method method, Object[] args, Object target) throws Throwable {
- System.out.println("Before method: " + method.getName());
- }
- }
重點關注的代碼為before方法以及ProxyFactory將實體轉化為代理類的過程。
以上代碼表明在執行MessageWriter的所有方法之前,都會先執行before之內的內容。
2. 後置通知
後置通知與前置通知類似,只是後置通知需實現org.springframework.aop.AfterReturningAdvice接口的afterReturning方法,該方法同樣接受三個參數:被調用的方法、傳給該方法的參數和目標對象。
3. 包圍通知
包圍通知在功能上綜合了前置通知和後置通知,除了一個重要區別:我們可以修改方法的返回值,不僅如此,我們還可以阻止目標方法的實際執行。這意味著用包圍通知,我們可以將目標方法的實現完全更換成新的代碼。
包圍通知實現了org.aopalliance.intercept.MethodInterceptor的invoke方法,該方法只接受MethodInvocation對象,但可通過以下方法獲取被調用的方法、傳給該方法的參數和目標對象:
- Method m = invocation.getMethod();
- Object target = invocation.getThis();
- Object[] args = invocation.getArguments();
調用包圍通知的方式與前置通知和後置通知類似,使用ProxyFactory。
4. 拋出通知
拋出通知跟後置通知一樣是在連接點之後運行的,不過拋出通知只在方法拋出一個異常時才執行。
拋出通知實現org.springframework.aop.ThrowsAdvice接口,該接口沒有定義任何方法,Spring是通過查看拋出通知中的一個或多個名為afterThrowing的public方法來處理拋出通知的。該方法的返回值類型並不重要,不過一般定義為void,因為該方法不能返回任何有意義的值。
對於拋出的每一個異常,Spring只會運行一個afterThrowing。