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對持久層的操作就是借助於四 核 物件...