MyBatis你只寫了介面為啥就能執行SQL啊?

2022-09-15 05:36:10 字數 1732 閱讀 9959

又是一年秋招季,很多小夥伴開始去大城市打拼。來大城市第一件事就是租房,免不了和中介打交道,因為很多房東很忙,你根本找不到他。從這個場景中就可以抽象出來**模式:

uml圖如下:

舉個例子來理解一下這個設計模式:

老闆讓記錄一下使用者服務的響應時間,用**模式來實現這個功能。

一切看起來都非常的美好,老闆又發話了,把產品服務的響應時間也記錄一下吧。又得寫如下3個類:

userserviceproxy和productserviceproxy這兩個**類的邏輯都差不多,卻還得寫2次。其實這個還好,如果老闆說,把現有系統的幾十個服務的響應時間都記錄一下吧,你是不是要瘋了?這得寫多少**類啊?

黑暗總是暫時的,終究會迎來黎明,在jdk1.3之後引入了一種稱之為動態**(dynamic proxy)的機制。使用該機制,我們可以為指定的介面在系統執行期間動態地生成**物件,從而幫助我們走出最初使用靜態**實現aop的窘境

動態**的實現主要由乙個類和乙個介面組成,即j**a.lang.reflect.proxy類和j**a.lang.reflect.invocationhandler介面。

讓我們用動態**來改造一下上面記錄系統響應時間的功能。雖然要為iuserservice和iproductservice兩種服務提供**物件,但因為**物件中要新增的橫切邏輯是一樣的。所以我們只需要實現乙個invocationhandler就可以了。**如下

uml圖如下。恭喜你,你現在已經理解了spring aop是怎麼回事了,就是這麼簡單,今天先不展開談spring

先簡單談談動態**在mybatis中是如何被大佬玩的出神入化的

直覺告訴我,乙個介面是不能執行的啊,一定有介面的實現類,可是這個實現類我自己沒寫啊,難道mybatis幫我們生成了?你猜的沒錯,mybatis利用動態**幫我們生成了介面的實現類,這個類就是:

和上面的uml類圖對比一下,發現不就少了乙個subjectimpl類嗎?那應該就是subjectproxy類把subjectimple類要做的事情做了唄,猜對了。subjectproxy通過subjectimple和subjectimple.xml之間的對映關係知道自己應該執行什麼sql。所以mybatis最核心的思路就是這麼個意思,細節之類的可以看原始碼,理清最主要的思路,看原始碼就能把握住重點。

關於原始碼相關的內容,更進一步的解釋動態**在mybatis中的使用,可以參考以前的一篇文章:《動態**之投鞭斷流!

看一下mybatis的底層實現原理!》

附錄:

今天你寫了自動化測試嗎

一艘貨輪滿載著貨物從港口啟航,向浩瀚的大海深處破水而去。海面平靜,微微皺起波浪,從容而顯得寬容。然而,貨輪的步履卻有些蹣跚,發動機 轟轟轟 地嘶吼著,不堪重負,卻無法讓船隻游得更快,倒像是海水咬住了船底往下在拖曳。嘟 嘟 嘟 突然警報聲響起,甲板上變得喧鬧起來,乙個水手模樣的年輕人聲嘶力竭地吶喊 船...

華為怎樣讓你的隱私只屬於你?

移動網際網路的成熟,萬物互聯時代的快速到來,讓幾乎所有業務都可以智慧型線上辦理。人們在享受這些便利的同時,支付密碼 身份證資訊 等個人資訊,甚至使用習慣 輸入片語 搜尋記錄等資料,也成為被網際網路應用覬覦的 金礦 作為無數使用者的消費終端提供者,怎樣保護好使用者的隱私安全,成為華為最關注的事情。從最...

只是為了拾起乙隻筆,所以寫了這些

很久不寫東西了,回首這些年,從高中那會兒,寫作文覺得好簡單,找三個點,每個點再拓展下下,八百字很快就搞定了,現在不一樣了,情緒略微激動都能讓自己開始結巴,時間真是把好牛刀啊!不過一樣的是還是喜歡閱讀,還是喜歡各種精美的文字,技術的亦或是實事短評,但是不再喜歡文縐縐的東西了,感覺自己受不了那種無聊的文...