mybatis在四大物件的建立過程中,都會有外掛程式進行介入。
在四大物件建立的時候
1. 每個建立出來的物件不是直接返回的,而是
interceptorchain.pluginall(parameterhandler);
2. 獲取到所有的interceptor(***)(外掛程式需要實現的介面);
呼叫interceptor.plugin(target);返回target包裝後的物件
3. 外掛程式機制,我們可以使用外掛程式為目標物件建立乙個**物件;aop(面向切面)
我們的外掛程式可以為四大物件建立出**物件;
**物件就可以攔截到四大物件的每乙個執行;
1、編寫interceptor的實現類
2、使用@intercepts註解完成外掛程式簽名
3、將寫好的外掛程式註冊到全域性配置檔案中
如我們寫的myfirstplugin,其外掛程式簽名為:
@intercepts那麼將其納入到我們mybatis查詢的邏輯裡面,是在basestatementhandler構造方法執行的時候,執行()
this在newparameterhandler時.parameterhandler
= configuration
.newparameterhandler(,
parameterobject
, boundsql
);
parameterhandler =呼叫到myfirstplugin的plugin方法(parameterhandler
) interceptorchain
.pluginall
(parameterhandler
);
object在wrap方法中,會進行判斷是不是指定的type,如果是指定的,那麼就建立乙個**物件wrap =
plugin
.wrap(o
, this
);
public static注意:return proxy.newproxyinstance(new plugin)object
wrap
(object
target
, interceptor
interceptor
)
return
target;}
之後返回到******executor中執行preparestatements方法
private這個handler就是我們前面建立的**物件。statement
preparestatement
(statementhandler
handler
, log
statementlog
) throws
sqlexception
在prepare和parameterize方法中,如果其為**物件,那麼會執行plugin class的invoke方法
@override如果method對應上了,那麼就執行interceptor.intercept,去執行myfirstplugin的intercept介面public
object
invoke
(object
proxy
, method
method
, object
args
) throws
throwable
return
method.invoke
(target
, args);
} catch
(exception e)
}
沒有對應上,那麼就直接放行
當我定義兩個相同的plugin的時候,
多個外掛程式會產生多層**的乙個**物件
原因就是:
publictarget = interceptor.plugin(target);這句,由myfirstplugin包裝好的**物件再作為target,再生成一次targetobject
pluginall
(object
target
)
return
target;}
呼叫plugin的invoke方法的時候
@override就會先呼叫mysecondfilter的intercept方法,再呼叫myfirstfilter的intercept方法。public
object
invoke
(object
proxy
, method
method
, object
args
) throws
throwable
return
method.invoke
(target
, args);
} catch
(exception e)
}
原始碼參考:
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...