mybatis 外掛程式原理

2021-08-03 19:49:44 字數 3030 閱讀 1006

1、mybatis初始化

每個基於 mybatis 的應用都是以乙個 sqlsessionfactory 的例項為中心的。sqlsessionfactory 

的例項可以通過 sqlsessionfactorybuilder 獲得。而 sqlsessionfactorybuilder 則可以從 xml

配置檔案或乙個預先定製的 configuration 的例項構建出 sqlsessionfactory 的例項。(摘自www.mybatis.org)

mybatis的核心配置類就是configuration,初始化時肯定是根據xml得到configuration進而得到sqlsessionfactory。

現在我們使用spring+mybatis一般會配置兩個bean

org.mybatis.spring.sqlsessionfactorybean

sqlsessionfactorybean就是用來初始化mybatis的

sqlsessionfactorybean實現了幾個spring的介面

實現factorybean在getobject()返回了sqlsessionfactory

實現initializingbean在afterpropertiesset()呼叫了buildsqlsessionfactory()

buildsqlsessionfactory()方法

if (this.configlocation != null)  

......

xmlconfigbuilder.parse();

xmlconfigbuilder傳入了配置檔案,那麼按照道理它應該會初始化configuration,對應的方法就是xmlconfigbuilder.parse()

public configuration parse() 

parsed = true;

parseconfiguration(parser.evalnode("/configuration"));

return configuration;

} private void parseconfiguration(xnode root) catch (exception e)

}

可以看到配置檔案中那些properties,plugins,settings等都設定configuration對應屬性裡面了。

buildsqlsessionfactory()最後就是return this.sqlsessionfactorybuilder.build(configuration);還是使用的mybatis的sqlsessionfactorybuilder

2、外掛程式

外掛程式需要實現的介面

public inte***ce interceptor 

//工具方法plugin

public class plugin implements invocationhandler

public static object wrap(object target, interceptor interceptor)

return target;

} public object invoke(object proxy, method method, object args) throws throwable

return method.invoke(target, args);

} catch (exception e)

} //配置外掛程式例

@intercepts() })

type要攔截什麼物件,executor,statementhandler,resultsethandler,parameterhandler

method要攔截的方法

args方法的引數

3、外掛程式鏈的生成及執行

外掛程式作用在四個物件上面executor,statementhandler,resultsethandler,parameterhandler

操作sql需要使用sqlsession物件,實現類defaultsqlsession裡面的方法最終都呼叫了executor方法

configuration的四個方法

executor newexecutor(...)

statementhandler newstatementhandler(...)

resultsethandler newresultsethandler(...)

parameterhandler newparameterhandler(...)

//每個方法最後都呼叫了interceptorchain.pluginall(..)

public object pluginall(object target)

return target;

}

由於上面的初始化,如果我們配置了plugins,那麼此時interceptors裡面會有我們配置的外掛程式物件

這樣迴圈呼叫的結果就是生成了乙個鏈,假如有兩個會形成下面的

第2層     intercept(invocation)     invocation指向第1層

第1層 intercept(invocation) invocation指向target

原始的target

最後得到的**物件,執行對應方法時候,如果註解配置滿足,就會執行外掛程式的intercept方法,

當然如果我們需要讓外掛程式繼續往下執行,則必須return invocation.proceed()

外掛程式的原理執行過程就是這樣。

繼續看executor後續執行會發現,它又呼叫用了statementhandler方法,而statementhandler在處理引數時候

呼叫了parameterhandler,查詢結束返回時候呼叫了resultsethandler

sqlsession->executor->statementhandler->

Mybatis 外掛程式原理

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

Mybatis外掛程式原理

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

Mybatis 外掛程式原理解析

mybati s作為 個應 泛的優秀的orm開源框架,這個框架具有強 的靈活性,在四 元件 executor statementhandler parameterhandler resultsethandler 處提供了簡單易 的插 件擴充套件機制。mybatis對持久層的操作就是借助於四 核 物件...