在mybatis中使用外掛程式,我們必須實現介面interceptor。
public inte***ce interceptor
外掛程式的初始化是在mybatis初始化的時候完成的。
public class xmlconfigbuilder extends basebuilder
}}}
在解析配置檔案的時候,在mybatis的上下文初始化過程中,就開始讀入外掛程式節點和我們配置的引數,同時使用反射技術生成對應的外掛程式例項,然後呼叫外掛程式方法中的setproperties方法,設定我們配置的引數,然後將外掛程式例項儲存到配置物件中,以便讀取和使用它。
外掛程式在configuration物件中的儲存:
public void addinterceptor(interceptor interceptor)
外掛程式用的是責任鏈模式,mybatis的責任鏈是由interceptorchain去定義的。在mybatis建立executor執行器的時候,我們可以看到有如下的一段**:
executor = (executor) interceptorchain.pluginall(executor);
再看下interceptor的pluginall方法:
public class interceptorchain
return target;
} ......
}
mybatis為我們提供了plugin類用於生成**物件。
public class plugin implements invocationhandler
return target;
} @override
public object invoke(object proxy, method method, object args) throws throwable
// 否則,直接反射排程我們要執行的方法
return method.invoke(target, args);
} catch (exception e)
}}
在呼叫外掛程式的攔截方法時,可以看到傳遞了乙個新建立的invocation物件。
interceptor.intercept(new invocation(target, method, args));
invocation類封裝了被**的物件、方法及其引數。
public class invocation
// 這個方法會排程被**物件的真實方法, 所以我們通過這個方法直接呼叫被**物件原來的方法
// 如果多個外掛程式的話,我們知道會生成多層**物件,那麼每層被**都可以通過invocation呼叫這個proceed方法,
// 所以在多個外掛程式的環境下,排程proceed()方法時,mybatis總是從最後乙個**物件執行到第乙個**物件,
// 最後是真實被攔截的物件方法被執行
public object proceed() throws invocationtargetexception, illegalacces***ception
}
深入淺出Mybatis 外掛程式原理
mybatis採用責任鏈模式,通過動態 組織多個 外掛程式 通過這些 可以改變mybatis的預設行為 諸如sql重寫之類的 由於外掛程式會深入到mybatis的核心,因此在編寫自己的外掛程式前最好了解下它的原理,以便寫出安全高效的外掛程式。mybatis 支援對executor statement...
深入淺出MFC筆記
深入淺出mfc筆記 一 勿在浮砂築高台 1 並不是擴充套件名為 dll dynamic link library 的才是動態鏈結庫。事實上,exe dll fon mod drv 和.ocx 都是所謂的動態鏈結函式庫。2 windows 程式編譯時需要包含 windows.h 標頭檔案,若需要使用諸...
深入淺出sizeof
int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...