妳好
攔截器的壹個作用就是我們可以攔截某些方法的調用,我們可以選擇在這些被攔截的方法執行前後加上某些邏輯,也可以在執行這些被攔截的方法時執行自己的邏輯而不再執行被攔截的方法。Mybatis攔截器設計的壹個初衷就是為了供用戶在某些時候可以實現自己的邏輯而不必去動Mybatis固有的邏輯。打個比方,對於Executor,Mybatis中有幾種實現:BatchExecutor、ReuseExecutor、SimpleExecutor和CachingExecutor。這個時候如果妳覺得這幾種實現對於Executor接口的query方法都不能滿足妳的要求,那怎麽辦呢?是要去改源碼嗎?當然不。我們可以建立壹個Mybatis攔截器用於攔截Executor接口的query方法,在攔截之後實現自己的query方法邏輯,之後可以選擇是否繼續執行原來的query方法。
對於攔截器Mybatis為我們提供了壹個Interceptor接口,通過實現該接口就可以定義我們自己的攔截器。我們先來看壹下這個接口的定義:
package?org.apache.ibatis.plugin;import?java.util.Properties;
public?interface?Interceptor?{
Object?intercept(Invocation?invocation)?throws?Throwable; Object?plugin(Object?target); void?setProperties(Properties?properties);}
我們可以看到在該接口中壹***定義有三個方法,intercept、plugin和setProperties。plugin方法是攔截器用於封裝目標對象的,通過該方法我們可以返回目標對象本身,也可以返回壹個它的代理。當返回的是代理的時候我們可以對其中的方法進行攔截來調用intercept方法,當然也可以調用其他方法,setProperties方法是用於在Mybatis配置文件中指定壹些屬性的。
定義自己的Interceptor最重要的是要實現plugin方法和intercept方法,在plugin方法中我們可以決定是否要進行攔截進而決定要返回壹個什麽樣的目標對象。而intercept方法就是要進行攔截的時候要執行的方法。
對於plugin方法而言,其實Mybatis已經為我們提供了壹個實現。Mybatis中有壹個叫做Plugin的類,裏面有壹個靜態方法wrap(Object target,Interceptor interceptor),通過該方法可以決定要返回的對象是目標對象還是對應的代理。
希望對妳有幫助