mybatis源碼解析 - 核心基礎組件之反射

接上篇文章咱們分享了mybatis緩存組件後,今天咱們來分享一下mybatis的動態反射組件。mybatis反射模塊封裝得很是精妙,你們若是在項目中有POJO對象通用反射搞不定的,能夠多參考一下mybatis反射組件。今天咱們就來讀讀這塊源碼。數據庫

總體設計架構緩存

image.png

mybatis對POJO反射這塊的設計,個人源碼思路是按照以下的流程來的mybatis

image.png

首先,根據POJO類實例化建立相應的對象,這步實際實現的入口在DefaultObjectFactory裏面。獲得實例化的對象後,經過Reflector基礎工具初始化並構建對象全部相關的元數據信息和底層相關的通用API(確實封裝得比較全面和嚴謹)。最後就是根據解析到的元數據,傳入實參,進行屬性的一一賦值操做並返回結果對象等的過程。架構

OK, 那麼按照上面的思路,咱們先來看看反射組件設計架構app

組件設計架構image.pngide

ObjectFactory: 產生POJO的實例對象的工廠核心接口函數

DefaultObjectFactory: 對象工廠的默認實現,它經過構造函數的方式建立對象的實例。有參和無參構造函數都支持,只是有參構造函數建立過程相對複雜一些(接下來會看到相應的源碼);工具

ObjectWrapper: 對對象和對象賦值過程的包裝,抽象了對象的屬性,定義了一些列查詢、設置和更新對象屬性信息的相關API;spa

BeanWrapper: ObjectWrapper的默認實現,它經過MetaClass實際建立和操做對象的屬性和其它信息;設計

ObjectWrapperFactory:  ObjectWrapper工廠,此接口目前在mybatis中沒有實際起到做用;

DefaultObjectWrapperFactory: ObjectWrapperFactory默認實現,此實現類並無實際擔負建立ObjectWrapper的職責,更多隻是參數的佔位使用(等下源碼中會看到);

ReflectorFactory: 定義Reflector建立的反射工廠接口;

DefaultReflectorFactory: 負責Reflector反射底層基礎類的建立和管理;

Reflector: 反射的底層核心實現類,它是mybatis反射組件的基礎;每一個Reflector對象都對應一個類,在其中緩存了反射操做所須要的全部元數據信息;

MetaClass: 爲了屏蔽複雜度,統一封裝了ReflectorFactory和Reflector的經常使用操做,做爲操做底層反射的入口類;

MetaObject: 做爲訪問mybatis反射的門面,打包和封裝ObjectWrapper,ObjectWrapperFactory,Reflector,ReflectorFactory的操做,提供主要主要的業務操做接口和默認參數自己默認的實現等;

反射建立對象

image.png

截圖代碼註釋很清楚了,這裏很少解釋。調用方式以下:

image.png

元數據信息提取和緩存

image.png

一直據說mybatis反射有個強大功能,當咱們POJO對象沒有實現get或set方法的時候,mybatis會幫咱們自動建立這些屬性的get和set方法,它是如何實現的?

image.png

如上截圖,個人pojo類忘了生成get/set方法,這時mybatis的處理是這樣的

image.png

image.png

看到這裏,有沒有以爲mybatis反射很強大 ?

對象賦值設計

image.png

那ObjectWrapper究竟在哪裏建立和實例化的呢?

image.png

看到了吧,實際ObjectWrapper的實例化是在MetaObject中完成的!DefaultObjectWrapperFactory實現類實際爲工廠默認實現的佔位,固然ObjectWrapperFactory還有另外的自定義的工廠實現, 應該是配合這些工廠實現類而建立的默認實現佔位;

image.png

ObjectWrapper從這裏完成實例化,而後調用MetaClass對象完成賦值

image.png

OK, 看到這裏對mybatis三個步驟的反射設計思路應該很明瞭了吧 ?那麼還有最後一個問題,反射這套設計是如何被mybatis其它層所集成的呢,咱們接着來一氣呵成,  直搗黃龍!

image.png

image.png

從以上的截圖可知,mybatis的反射主要用於:數據源組件、Executor執行組件(從數據庫結果集到POJO對象的轉換)、Cache、Session組件等地方。後面在分析mybatis運行流程的時候還會提到這些地方,這裏先不每一個都展開分析。


總結

OK, 以上就是mybatis反射組件的分享,其實我以爲mybatis設計思路仍是至關清晰的。這裏面Reflector基礎類裏面有的比較底層的封裝,很值得分析和玩味!有興趣的建議能夠深刻分析這個類,它封裝得很全面也相對比較底層。今天的分享暫時就到這裏,更多mybatis精彩的內容,請繼續關注!

相關文章
相關標籤/搜索