深入淺出MyBatis筆記 外掛程式

2021-09-13 18:28:40 字數 1654 閱讀 3546

在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...