mybatis外掛程式開發原理及方法

2021-09-23 18:27:38 字數 3209 閱讀 3814

mybatis在四大物件的建立過程中,都會有外掛程式進行介入。

在四大物件建立的時候

1. 每個建立出來的物件不是直接返回的,而是

interceptorchain.pluginall(parameterhandler);

2. 獲取到所有的interceptor(***)(外掛程式需要實現的介面);

呼叫interceptor.plugin(target);返回target包裝後的物件

3. 外掛程式機制,我們可以使用外掛程式為目標物件建立乙個**物件;aop(面向切面)

我們的外掛程式可以為四大物件建立出**物件;

**物件就可以攔截到四大物件的每乙個執行;

1、編寫interceptor的實現類

2、使用@intercepts註解完成外掛程式簽名

3、將寫好的外掛程式註冊到全域性配置檔案中

如我們寫的myfirstplugin,其外掛程式簽名為:

@intercepts

()

那麼將其納入到我們mybatis查詢的邏輯裡面,是在basestatementhandler構造方法執行的時候,執行

this

.parameterhandler

= configuration

.newparameterhandler(,

parameterobject

, boundsql

);

在newparameterhandler時

parameterhandler = 

(parameterhandler

) interceptorchain

.pluginall

(parameterhandler

);

呼叫到myfirstplugin的plugin方法

object 

wrap =

plugin

.wrap(o

, this

);

在wrap方法中,會進行判斷是不是指定的type,如果是指定的,那麼就建立乙個**物件

public static 

object

wrap

(object

target

, interceptor

interceptor

)  

return

target;}

注意:return proxy.newproxyinstance(new plugin)

之後返回到******executor中執行preparestatements方法

private 

statement

preparestatement

(statementhandler

handler

, log

statementlog

) throws

sqlexception

這個handler就是我們前面建立的**物件。

在prepare和parameterize方法中,如果其為**物件,那麼會執行plugin class的invoke方法

@override

public

object

invoke

(object

proxy

, method

method

, object

args

) throws

throwable

return

method.invoke

(target

, args);

} catch

(exception e)

}

如果method對應上了,那麼就執行interceptor.intercept,去執行myfirstplugin的intercept介面

沒有對應上,那麼就直接放行

當我定義兩個相同的plugin的時候,

多個外掛程式會產生多層**的乙個**物件

原因就是:

public 

object

pluginall

(object

target

)  

return

target;}

target = interceptor.plugin(target);這句,由myfirstplugin包裝好的**物件再作為target,再生成一次target

呼叫plugin的invoke方法的時候

@override

public

object

invoke

(object

proxy

, method

method

, object

args

) throws

throwable

return

method.invoke

(target

, args);

} catch

(exception e)

}

就會先呼叫mysecondfilter的intercept方法,再呼叫myfirstfilter的intercept方法。

原始碼參考:

mybatis 外掛程式原理

1 mybatis初始化 每個基於 mybatis 的應用都是以乙個 sqlsessionfactory 的例項為中心的。sqlsessionfactory 的例項可以通過 sqlsessionfactorybuilder 獲得。而 sqlsessionfactorybuilder 則可以從 xml...

Mybatis 外掛程式原理

哪些物件允許被 外掛程式 executor parameterhandler statementhandler resultsethandler 什麼時候建立 物件 executor sqlsession.opensession的時候被 其他3個建立的時候被 多個外掛程式的時候,執行順序 被 的順序...

Mybatis外掛程式原理

外掛程式原理 在四大物件建立的時候 1 每個建立出來的物件不是直接返回的,而是 interceptorchain.pluginall parameterhandler 2 獲取到所有的interceptor 基於 原理 外掛程式需要實現的介面 呼叫所有的interceptor.pluginall t...