MyBatis(七) —— MyBatis的動態代理

動態代理的相關知識參考我前面的一篇文章→Mybatis(二)—— 動態代理,這篇文章主要看看MyBatis的底層源碼,看它是如何實現動態代理的:

在前面的MyBatis的使用中,我們可以看到,每次都會用到這句代碼:

在這裏插入圖片描述
那我們就從getMapper進去,看看MyBatis底層是如何生成代理對象的:
在這裏插入圖片描述
顯然,它運用到了configuration對象(configuration是一個單例對象,它作爲一個統領,所有的配置文件都會緩存在這裏,然後通過它,一步一步的構建所需的內容,創建最終的對象(建造者模式))的getMapper方法,然後我們繼續跟蹤這個方法:
在這裏插入圖片描述
再點進去,我們會看到:
在這裏插入圖片描述
到這裏,首先它會判斷是否註冊一個Mapper,如果沒有則拋出異常,如果有,就會啓用mapperProxyFactory工廠來生成一個代理實例,爲此,我們從框起來的代碼進去:
在這裏插入圖片描述
在這裏插入圖片描述
注意看下面有箭頭的地方的代碼,Mapper是通過動態代理來實現的,這裏可以看到動態代理對接口的綁定,它的作用就是生成動態代理對象,而代理的方法則被放到了MapperProxy中,爲此我們再進一層:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
如果Mapper是一個JDK動態代理對象,那麼它就會運行到invoke方法裏面;invoke首先判斷是否是一個類,這裏Mapper是一個接口不是類,所以判斷失敗,然後會生成MapperMethod對象,它是通過cachedMapperMethod方法對其初始化的,最後執行execute方法,把SqlSession和當前運行的參數傳遞進去,execute方法的源碼如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

方法比較多,只看框中的即可,我們可以看到,最終都是通過SqlSession對象去運行對象的SQL而已,其他的增刪改查也是類似這樣處理的,至此,相信大家已經知道爲什麼MyBatis接口便能運行了,因爲Mapper的XML的命名空間對應的是這個類的全限定名,二方法就是那條SQL的id,這樣MyBatis就可以根據全路徑名和方法名,將其和代理對象綁定起來,通過動態代理技術,讓這個接口運行起來,而後採用命令模式,最後使用SqlSession接口的方法便能夠執行對應的SQL,只是有了這層封裝,就可以採用接口編程,這樣編程更爲簡單明瞭;

所以再MyBatis的動態代理裏面,公共接口就是我們自己寫的那個接口,代理類就是SqlSession,委託者也就是具體實現類是Execute(在configuration對象中創建的,點進去一點就會看到執行者是Execute的實現類);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章