工廠模式
**模式
我們知道有3類23種設計模式,我們來看看mybatis原始碼中使用了哪些設計模式
模式mybatis體現
builder模式
例如sqlsessionfactorybuilder、environment
工廠方法模式
例如sqlsessionfactory、transactionfactory、logfactory
單例模式
例如errorcontext、logfactory
**模式
組合模式
例如sqlnode和各個子類choosesqlnode
模板方法模式
例如baseexecutor和******executor,還有basetypehandler和所有子類例如intertypehandler
介面卡模式
例如log的mybatis介面和它對jdbc、log4j等各種日誌框架的適配實現
裝飾者模式
例如cache包中的cache.decorators子包中等各個裝飾者的實現
迭代器模式
例如迭代器模式propertytokenizer
接下來對builder構建者模式、工廠模式、**模式進行解讀,先簡單介紹下模式自身,然後再解讀在mybatis中怎樣應用了該模式
builder模式的定義是將乙個輔助物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示,它屬於建立類模式。一般來說,如果乙個物件的構建比較複雜,超出了建構函式所能包含的範圍,就可以使用工廠模式或builder模式。相當於工廠模式會產出乙個完整的產品,builder模式應用於更加複雜物件的構建,甚至只會侯建產品的乙個部分。直白來說,就是使用多個簡單的物件一步一步構建成乙個複雜物件例子:使用構建者設計模式來生產computer
主要步驟:
mybatis中的體現
sqlsessionfactory 的構建過程:
private
void
parseconfiguration
(xnode root)
catch
(exception e)
}
在這個過程中,有乙個相似的特點,就是這些builder會讀取檔案或配置,然後做大了的xpathparser解析、配置或者語法解析、反射生成物件、存入結果快取等步驟,這麼多的工作不是乙個建構函式能包括的因此採用了builder模式來解決在mybatis中比如sqlsessionfactory使用的是工廠模式,該工廠沒有那麼複雜的邏輯,是乙個簡單工廠模式。
簡單工廠模式(****** factory pattern): 又稱靜態工廠方法模式(static factory method),它屬於建立型模式在簡單工廠模式中,可以根據引數的不同,返回不同類的例項。簡單工廠模式專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類例子:生產電腦
假設有衣蛾電腦的代工生產商,它可以生產聯想電腦,隨著業務的拓展,這個工廠還能生產惠普電腦了,我們可以用乙個單獨的類來專門生產電腦,這就用到了簡單工廠模式。
mybatis體現
有乙個sqlsessionfactory來負責sqlsession的建立
可以看到,
sqlsessionfactory
的opensession()
方法過載了多個,分別支援 autocommit、executortype、transactionisolationlevel等引數的輸入,來構建核心的sqlsession物件。在defaultsqlsessionfactory 的預設工廠實現裡,有乙個方法可以看出工廠怎麼生產出sqlsession:
這是乙個opensession 呼叫的底層方法,該方法先從 configuration 讀取相應的環境配置,然後初始化 transactionfactory 獲得乙個 transaction 物件,然後通過 transaction 獲取乙個 executor物件,最後通過configuration, executor, autocommit 三個引數構建了 sqlsessionprivate sqlsession opensessionfromdatasource
(executortype exectype, transactionisolationlevel level,
boolean autocommit)
catch
(exception e)
finally
}
**模式(proxy pattern)給某乙個物件提供乙個**,並由**物件控制對原物件的引用。**模式是一種物件結構型模式,**模式分為靜態**和動態**,我們這裡來介紹下動態**例子mybatis體現
package org.apache.ibatis.binding;
public
class
public class()
getmethodcache()
@suppresswarnings
("unchecked"
)protected t newinstance
public t newinstance
(sqlsession sqlsession)
}
package org.apache.ibatis.binding;
public
class
implements
invocationhandler
, serializable
else
if(method.
isdefault()
)}catch
(throwable t)
(method)
;execute
(sqlsession, args);}
...}
MyBatis中的設計模式
builder模式 工廠模式 單例模式 errorcontext和logfactory 模式 組合模式 sqlnode和各個子類choosesqlnode等 模板方法模式 baseexecutor和 executor,還有basetypehandler和所有的子類例如integertypehandl...
MyBatis快取機制的設計
session會話級別的快取,位於表示一次資料庫會話的sqlsession物件之中,即本地快取。一級快取是mybatis內部實現的乙個特性,使用者不能配置,預設自動支援,使用者無定製權利。應用級別的快取,生命週期長,跟應用的生命週期一樣,即作用範圍為整個應用。預設關閉,也不建議使用,一般用redis...
一 MyBatis的整體設計
此文出自感謝chenjc it的整理 1 載入配置並初始化 觸發條件 載入配置檔案 2 接收呼叫請求 觸發條件 呼叫mybatis提供的api 傳入引數 為sql的id和傳入引數物件 處理過程 將請求傳遞給下層的請求處理層進行處理。3 處理操作請求 觸發條件 api介面層傳遞請求過來 傳入引數 為s...