Mybatis 插件原理解析
Mybati s作為⼀個(gè)應(yīng)⽤⼴泛的優(yōu)秀的ORM開源框架,這個(gè)框架具有強(qiáng)⼤的靈活性,在四⼤組件
(Executor、StatementHandler、ParameterHandler、ResultSetHandler)處提供了簡(jiǎn)單易⽤的插 件擴(kuò)展機(jī)制。
Mybatis對(duì)持久層的操作就是借助于四⼤核⼼對(duì)象。MyBatis⽀持⽤插件對(duì)四⼤核⼼對(duì)象進(jìn) ⾏攔截,對(duì)mybatis來說
插件就是攔截器,⽤來增強(qiáng)核⼼對(duì)象的功能,增強(qiáng)功能本質(zhì)上是借助于底層的 動(dòng)態(tài)代理實(shí)現(xiàn)的,換句話說,
MyBatis中的四⼤對(duì)象都是代理對(duì)象
MyBatis所允許攔截的⽅法如下:
- 執(zhí)⾏器Executor (update、query、commit、rollback等⽅法);
- SQL語法構(gòu)建器StatementHandler (prepare、parameterize、batch、updates query等⽅法);
- 參數(shù)處理器ParameterHandler (getParameterObject、setParameters⽅法);
- 結(jié)果集處理器ResultSetHandler (handleResultSets、handleOutputParameters等⽅法);
在四⼤對(duì)象創(chuàng)建的時(shí)候
- 每個(gè)創(chuàng)建出來的對(duì)象不是直接返回的,⽽是interceptorChain.pluginAll(parameterHandler);
- 獲取到所有的Interceptor (攔截器)(插件需要實(shí)現(xiàn)的接⼝);調(diào)⽤ interceptor.plugin(target);返回
- target 包 裝后的對(duì)象
- 插件機(jī)制,我們可以使⽤插件為⽬標(biāo)對(duì)象創(chuàng)建⼀個(gè)代理對(duì)象;AOP (⾯向切⾯)我們的插件可 以為四⼤對(duì)象
創(chuàng)建出代理對(duì)象,代理對(duì)象就可以攔截到四⼤對(duì)象的每⼀個(gè)執(zhí)⾏;
自定義插件攔截:
Intercepts ({//注意看這個(gè)⼤花括號(hào),也就這說這⾥可以定義多個(gè)@Signature對(duì)多個(gè)地⽅攔截,都⽤這個(gè)攔截器 @Signature (type = StatementHandler .class , //這是指攔截哪個(gè)接⼝ method = "prepare",//這個(gè)接⼝內(nèi)的哪個(gè)⽅法名,不要拼錯(cuò)了 args = { Connection.class, Integer .class}), 這是攔截的⽅法的⼊參,按順序?qū)懙? 這,不要多也不要少,如果⽅法重載,可是要通過⽅法名和⼊參來確定唯⼀的 }) public class MyPlugin implements Interceptor { private final Logger logger = LoggerFactory.getLogger(this.getClass()); // //這⾥是每次執(zhí)⾏操作的時(shí)候,都會(huì)進(jìn)⾏這個(gè)攔截器的⽅法內(nèi) Override public Object intercept(Invocation invocation) throws Throwable { //增強(qiáng)邏輯 System.out.println("對(duì)⽅法進(jìn)⾏了增強(qiáng)...."); return invocation.proceed(); //執(zhí)⾏原⽅法 } /** * //主要是為了把這個(gè)攔截器⽣成⼀個(gè)代理放到攔截器鏈中 * ^Description包裝⽬標(biāo)對(duì)象 為⽬標(biāo)對(duì)象創(chuàng)建代理對(duì)象 * @Param target為要攔截的對(duì)象 * @Return代理對(duì)象 */ Override public Object plugin(Object target) { System.out.println("將要包裝的⽬標(biāo)對(duì)象:"+target); return Plugin.wrap(target,this); } /**獲取配置⽂件的屬性**/ //插件初始化的時(shí)候調(diào)⽤,也只調(diào)⽤⼀次,插件配置的屬性從這⾥設(shè)置進(jìn)來 Override public void setProperties(Properties properties) { System.out.println("插件配置的初始化參數(shù):"+properties ); } }
到此這篇關(guān)于Mybatis 插件原理解析的文章就介紹到這了,更多相關(guān)Mybatis 插件原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域
這篇文章主要介紹了詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域的相關(guān)資料,需要的朋友可以參考下2017-03-03SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源
咱們開發(fā)項(xiàng)目的過程中用到很多的開源數(shù)據(jù)庫鏈接池,比如druid、c3p0、BoneCP等等,本文主要介紹了SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11淺談java String.split丟失結(jié)尾空字符串的問題
下面小編就為大家?guī)硪黄獪\談java String.split丟失結(jié)尾空字符串的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07springboot手寫一個(gè)自己的starter源碼
在本篇文章里小編給大家整理了關(guān)于springboot手寫一個(gè)自己的starter源碼的全部知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-06-06Java設(shè)計(jì)模式開發(fā)中使用觀察者模式的實(shí)例教程
這篇文章主要介紹了Java設(shè)計(jì)模式開發(fā)中使用觀察者模式的實(shí)例教程,松耦合和邏輯清晰的消息監(jiān)聽是觀察者模式的大特色,需要的朋友可以參考下2016-04-04MyBatis?handleResultSet結(jié)果集解析過程示例
這篇文章主要為大家介紹了MyBatis?handleResultSet結(jié)果集解析過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02java springboot的概述、特點(diǎn)與構(gòu)建介紹
大家好,本篇文章主要講的是springboot的概述、特點(diǎn)與構(gòu)建介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Java數(shù)據(jù)結(jié)構(gòu)和算法之冒泡排序(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法。本文重點(diǎn)給大家介紹java數(shù)據(jù)結(jié)構(gòu)和算法之冒泡排序,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-04-04