最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

MyBatis 中用了哪些牛逼的設(shè)計(jì)模式?

2023-03-14 15:32 作者:兩年半的java練習(xí)生  | 我要投稿

在 MyBatis 的兩萬(wàn)多行的框架源碼中,使用了大量的設(shè)計(jì)模式對(duì)工程架構(gòu)中的復(fù)雜場(chǎng)景進(jìn)行解耦,這些設(shè)計(jì)模式的巧妙使用是整個(gè)框架的精華。

經(jīng)過(guò)整理,大概有以下設(shè)計(jì)模式,如下圖所示。


Mybatis 框架源碼10種設(shè)計(jì)模式

創(chuàng)建型模式

工廠(chǎng)模式

SqlSessionFactory 的結(jié)構(gòu)如下圖所示。


Mybatis 工廠(chǎng)模式

  • 工廠(chǎng)模式:簡(jiǎn)單工廠(chǎng),是一種創(chuàng)建型設(shè)計(jì)模式,其在父類(lèi)中提供一個(gè)創(chuàng)建對(duì)象的方法,允許子類(lèi)決定實(shí)例對(duì)象的類(lèi)型。

  • 場(chǎng)景介紹:SqlSessionFactory 是獲取會(huì)話(huà)的工廠(chǎng),每次我們使用 Mybatis 操作數(shù)據(jù)庫(kù)的時(shí)候,都會(huì)開(kāi)啟一個(gè)新的會(huì)話(huà)。在會(huì)話(huà)工廠(chǎng)的實(shí)現(xiàn)中負(fù)責(zé)獲取數(shù)據(jù)源環(huán)境配置信息、構(gòu)建事務(wù)工廠(chǎng)、創(chuàng)建操作 SQL 的執(zhí)行器,并最終返回會(huì)話(huà)實(shí)現(xiàn)類(lèi)。

  • 同類(lèi)設(shè)計(jì):SqlSessionFactory、ObjectFactory、MapperProxyFactory、DataSourceFactory

單例模式

Configuration 單例配置類(lèi)的結(jié)構(gòu)如下圖所示。


Mybatis 單例模式

  • 單例模式:是一種創(chuàng)建型模式,讓你能夠保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)訪(fǎng)問(wèn)該實(shí)例的全局節(jié)點(diǎn)。

  • 場(chǎng)景介紹:Configuration 就像狗皮膏藥一樣大單例,貫穿整個(gè)會(huì)話(huà)的生命周期,所以的配置對(duì)象;映射、緩存、入?yún)?、出參、攔截器、注冊(cè)機(jī)、對(duì)象工廠(chǎng)等,都在 Configuration 配置項(xiàng)中初始化。并隨著 SqlSessionFactoryBuilder 構(gòu)建階段完成實(shí)例化操作。

  • 同類(lèi)場(chǎng)景:ErrorContext、LogFactory、Configuration

建造者模式

ResultMap 建造者模式的結(jié)構(gòu)如下圖所示。



Mybatis 建造者模式

  • 建造者模式:使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象,這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。

  • 場(chǎng)景介紹:關(guān)于建造者模式在 Mybatis 框架里的使用,那真是紗窗擦屁股,給你漏了一手。到處都是 XxxxBuilder,所有關(guān)于 XML 文件的解析到各類(lèi)對(duì)象的封裝,都使用建造者以及建造者助手來(lái)完成對(duì)象的封裝。它的核心目的就是不希望把過(guò)多的關(guān)于對(duì)象的屬性設(shè)置,寫(xiě)到其他業(yè)務(wù)流程中,而是用建造者的方式提供最佳的邊界隔離。

  • 同類(lèi)場(chǎng)景:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder

類(lèi)型:結(jié)構(gòu)型模式

適配器模式

日志實(shí)現(xiàn)類(lèi)的結(jié)構(gòu)如下圖所示。

Mybatis 適配器模式

  • 適配器模式:是一種結(jié)構(gòu)型設(shè)計(jì)模式,它能使接口不兼容的對(duì)象能夠相互合作。

  • 場(chǎng)景介紹:正是因?yàn)橛刑嗟娜罩究蚣埽ǎ篖og4j、Log4j2、Slf4J 等等,而這些日志框架的使用接口又都各有差異,為了統(tǒng)一這些日志工具的接口,Mybatis 定義了一套統(tǒng)一的日志接口,為所有的其他日志工具接口做相應(yīng)的適配操作。

  • 同類(lèi)場(chǎng)景:主要集中在對(duì)日志的適配上,Log 和 對(duì)應(yīng)的實(shí)現(xiàn)類(lèi),以及在 LogFactory 工廠(chǎng)方法中進(jìn)行使用。

代理模式

代理模式的實(shí)現(xiàn)結(jié)構(gòu)如下圖所示。

Mybatis 代理模式

  • 代理模式:是一種結(jié)構(gòu)型模式,讓你能夠提供對(duì)象的替代品或其占位符。代理控制著對(duì)原對(duì)象的訪(fǎng)問(wèn),并允許在將請(qǐng)求提交給對(duì)象前進(jìn)行一些處理。

  • 場(chǎng)景介紹:不吹牛的講,沒(méi)有代理模式,就不會(huì)有各類(lèi)的框架存在。就像 Mybatis 中的 MapperProxy 映射器代理實(shí)現(xiàn)類(lèi),它所實(shí)現(xiàn)的功能就是幫助我們完成 DAO 接口的具體實(shí)現(xiàn)類(lèi)的方法操作,你的任何一個(gè)配置的 DAO 接口所調(diào)用的 CRUD 方法,都會(huì)被 MapperProxy 接管,調(diào)用到方法執(zhí)行器等一系列操作,并返回最終的數(shù)據(jù)庫(kù)執(zhí)行結(jié)果。

  • 同類(lèi)場(chǎng)景:DriverProxy、Plugin、Invoker、MapperProxy

組合模式

解析節(jié)點(diǎn)類(lèi)的結(jié)構(gòu)如下圖所示。

Mybatis 組合模式

  • 組合模式:是一種結(jié)構(gòu)型設(shè)計(jì)模式,你可以使用它將對(duì)象組合成樹(shù)狀結(jié)構(gòu),并且能獨(dú)立使用對(duì)象一樣使用它們。

  • 場(chǎng)景介紹:在 Mybatis XML 動(dòng)態(tài)的 SQL 配置中,共提供了 9 種(trim/where/set/foreach/if/choose/when/otherwise/bind)標(biāo)簽的使用,讓使用者可以組合出各類(lèi)場(chǎng)景的 SQL 語(yǔ)句。而 SqlNode 接口的實(shí)現(xiàn)就是每一個(gè)組合結(jié)構(gòu)中的規(guī)則節(jié)點(diǎn),通過(guò)規(guī)則節(jié)點(diǎn)的組裝完成一顆規(guī)則樹(shù)組合模式的使用。

  • 同類(lèi)場(chǎng)景:主要體現(xiàn)在對(duì)各類(lèi) SQL 標(biāo)簽的解析上,以實(shí)現(xiàn) SqlNode 接口的各個(gè)子類(lèi)為主。

裝飾器模式

二級(jí)緩存裝飾器的實(shí)現(xiàn)結(jié)構(gòu)如下圖所示。



Mybatis 裝飾器模式

  • 裝飾器模式:是一種結(jié)構(gòu)型設(shè)計(jì)模式,允許你通過(guò)將對(duì)象放入包含行為的特殊封裝對(duì)象中來(lái)為原對(duì)象綁定新的行為。

  • 場(chǎng)景介紹:Mybatis 的所有 SQL 操作,都是經(jīng)過(guò) SqlSession 會(huì)話(huà)調(diào)用 SimpleExecutor 簡(jiǎn)單實(shí)現(xiàn)的執(zhí)行器完成的,而一級(jí)緩存的操作也是在簡(jiǎn)單執(zhí)行器中處理。那么這里二級(jí)緩存因?yàn)槭腔谝患?jí)緩存刷新操作的,所以在實(shí)現(xiàn)上,通過(guò)創(chuàng)建一個(gè)緩存執(zhí)行器,包裝簡(jiǎn)單執(zhí)行器的處理邏輯,實(shí)現(xiàn)二級(jí)緩存操作。那么這里用到的就是裝飾器模式,也叫俄羅斯套娃模式。

  • 同類(lèi)場(chǎng)景:主要提前在 Cache 緩存接口的實(shí)現(xiàn)和 CachingExecutor 執(zhí)行器中。

行為型模式

模板模式

SQL 執(zhí)行模板模式如下圖所示。



Mybatis 模板模式

  • 模板模式:是一種行為設(shè)計(jì)模式,它在超類(lèi)中定義了一個(gè)算法的框架,允許子類(lèi)在不修改結(jié)構(gòu)的情況下重寫(xiě)算法的特定步驟。

  • 場(chǎng)景介紹:只要存在一系列可被標(biāo)準(zhǔn)定義的流程,在流程的步驟大部分是通用邏輯,只有一少部分是需要子類(lèi)實(shí)現(xiàn)的,那么通常會(huì)采用模板模式來(lái)定義出這個(gè)標(biāo)準(zhǔn)的流程。就像 Mybatis 的 BaseExecutor 就是一個(gè)用于定義模板模式的抽象類(lèi),在這個(gè)類(lèi)中把查詢(xún)、修改的操作都定義出了一套標(biāo)準(zhǔn)的流程。

  • 同類(lèi)場(chǎng)景:BaseExecutor、SimpleExecutor、BaseTypeHandler

策略模式

多類(lèi)型處理器策略模式的結(jié)構(gòu)如下圖所示。

Mybatis 策略模式

  • 策略模式:是一種行為設(shè)計(jì)模式,它能定義一系列算法,并將每種算法分別放入獨(dú)立的類(lèi)中,以使算法的對(duì)象能夠互相替換。

  • 場(chǎng)景介紹:在 Mybatis 處理 JDBC 執(zhí)行后返回的結(jié)果時(shí),需要按照不同的類(lèi)型獲取對(duì)應(yīng)的值,這樣就可以避免大量的 if 判斷。所以這里基于 TypeHandler 接口對(duì)每個(gè)參數(shù)類(lèi)型分別做了自己的策略實(shí)現(xiàn)。

  • 同類(lèi)場(chǎng)景:PooledDataSource\UnpooledDataSource、BatchExecutor\ResuseExecutor\SimpleExector\CachingExecutor、LongTypeHandler\StringTypeHandler\DateTypeHandler

迭代器模式

拆解字段解析實(shí)現(xiàn)的結(jié)構(gòu)如下圖所示。

Mybatis 迭代器模式

  • 迭代器模式:是一種行為設(shè)計(jì)模式,讓你能在不暴露集合底層表現(xiàn)形式的情況下遍歷集合中所有的元素。

  • 場(chǎng)景介紹:PropertyTokenizer 是用于 Mybatis 框架 MetaObject 反射工具包下,用于解析對(duì)象關(guān)系的迭代操作。這個(gè)類(lèi)在 Mybatis 框架中使用的非常頻繁,包括解析數(shù)據(jù)源配置信息并填充到數(shù)據(jù)源類(lèi)上,以及參數(shù)的解析、對(duì)象的設(shè)置都會(huì)使用到這個(gè)類(lèi)。

  • 同類(lèi)場(chǎng)景:PropertyTokenizer

總結(jié)

通過(guò)梳理,MyBatis 大約運(yùn)用了 10 種左右設(shè)計(jì)模式。可以說(shuō),復(fù)雜且優(yōu)秀的 ORM 框架源碼在設(shè)計(jì)和實(shí)現(xiàn)的過(guò)程中都會(huì)使用大量的設(shè)計(jì)模式。

在解決復(fù)雜場(chǎng)景的問(wèn)題時(shí),需要采用分治、抽象的方法,運(yùn)用設(shè)計(jì)模式和設(shè)計(jì)原則等相關(guān)知識(shí),把問(wèn)題合理切割為若干子問(wèn)題,以便加以理解和解決。

學(xué)習(xí)源碼遠(yuǎn)不是只是為了應(yīng)付面試,更重要的是學(xué)習(xí)優(yōu)秀框架在復(fù)雜場(chǎng)景下的解決方案。通過(guò)學(xué)習(xí)這些優(yōu)秀的方案技術(shù),可以提高對(duì)技術(shù)設(shè)計(jì)和實(shí)現(xiàn)的理解,擴(kuò)展編碼思維,積累落地經(jīng)驗(yàn)。只有經(jīng)過(guò)這樣長(zhǎng)期的積累,我們才更有可能成為優(yōu)秀的高級(jí)工程師和架構(gòu)師。


MyBatis 中用了哪些牛逼的設(shè)計(jì)模式?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
扬州市| 瓮安县| 韶山市| 武鸣县| 凌云县| 锡林郭勒盟| 冷水江市| 锡林郭勒盟| 镇江市| 威远县| 鄂尔多斯市| 贵港市| 海宁市| 罗源县| 汝州市| 祁门县| 景德镇市| 随州市| 祁门县| 广西| 贵港市| 五原县| 尉犁县| 富民县| 车致| 梓潼县| 乐陵市| 文安县| 江北区| 当阳市| 石家庄市| 盐池县| 潜山县| 铜川市| 仪征市| 迁西县| 安溪县| 湟中县| 阿巴嘎旗| 咸宁市| 定远县|