InvocationContext


 攔截器必須有一個InvocationContext型態的參數,它可以讓您取得Bean呼叫過程的相關資訊、設定或取得攔截器鏈(Interceptor Chain)所要共用的相關資料、決定是否繼續執行下一個攔截器,InvocationContext介面的定義如下:
public interface InvocationContext {
    public Object getTarget();
    public Method getMethod();
    public Object[] getParameters();
    public void setParameters(Object[]);
    public java.util.Map<String,Object> getContextData();
    public Object proceed() throws Exception;
}

getTarget()方法傳回的Object即為攔截器所作用的Bean實例。getMethod()則為目前所呼叫的Bean服務方法,若服務方法有 參數,getParameters()可取得傳遞給服務方法的參數物件,因為參數可能不只一個,所以會以陣列方式傳回,setParameters()則 可以讓您設定傳遞給方法的參數,所以,您可以使用getParameters()取得參數物件,加以修改後再利用setParameters()設定給服 務方法,若必要,也可以傳遞一個完全與原客戶端所給參數無關的物件給服務方法。

getContextData()將取得一個Map物件,在整個攔截器鏈中需要共用的資料,可以設定到這個Map物件中,例如:
context.getContextData().put("someData", "data...XD");

若需要取得共用資料時,則如下:
String data = (String) context.getContextData().get("someData");

InvocationContext的proceed()執行時,若下一個攔截器,則執行流程是交給下一個攔截器,若無下一個攔截器,則InvocationContext的proceed()執行時,是交給目標(Target)方法。

InvocationContext的proceed()會傳回一個物件,代表所呼叫方法的傳回值,若必要,您也可以處理這個傳回值,甚至替代傳回另一個不相關的物件。

攔截器可以丟出例外,要注意的是若是在 InvocationContext的proceed()丟出例外,proceed()不被執行,則流程不會交給下一個攔截器,攔截器鏈將被中斷。