BeforeAdvice:具體接口:MethodBeforeAdvice 在目標方法調用以前調用的Advice java
AfterAdvice:具體接口:AfterReturningAdvice 在目標方法調用並返回以後調用的Advice spring
AroundAdvice:具休接口:MethodInterceptor 在目標方法的整個執行先後有效,而且有能力控制目標方法的執行 ui
ThrowsAdvice:具體接口:ThrowsAdvice 在目標方法拋出異常時調用的Advice spa
在以上四種Advice中最爲特別的就是MethodInterceptor:方法攔截器.它的特別之處在於:首先他所在的包並不Srping中的包而是:org.aopalliance.intercept包.即MethodInterceptor實現了AOP聯盟接口,這一點保證了它較之其餘的Advice更具備通用性,由於它能夠在任何基於AOP聯盟接口實現的AOP系統中使用.第二點也就是其最爲突出的一點就是它所具備的其餘Advice所不能匹敵的功能:在目標方法的整個執行先後有效,而且有能力控制目標方法的執行!如下是一段具體代碼(引自Spring in Action iist3.5.) 接口
package com.springinaction.chapter03.store;
import java.util.HashSet;
import java.util.Set;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class OnePerCustomerInterceptor implements MethodInterceptor {
private Set customers = new HashSet();
public Object invoke(MethodInvocation invocation)
throws Throwable {
Customer customer = (Customer) invocation.getArguments()[0];
if (customers.contains(customer)) {
throw new KwikEMartException("One per customer.");
}
Object squishee = invocation.proceed(); //調用目標方法
customers.add(customer);
return squishee;
}
} get
在MethodInterceptor中有一個invoke方法,它們有一個MethodInvocation參數invocation,MethodInterceptor是能經過invocation的proceed方法來執行目標方法的.在顯式地調用這個方法時,咱們能夠在其以前和以後作一些相關操做,實現beforeAdvice和AfterAdvice的功能. io