Mybatis: 理解Mapper接口的代理流程

目錄

關係梳理:

Configuration

MapperRegistry

MapperProxyFactory

MapperProxy

MapperMethod

關於SqlSession的,會另起一篇文章介紹,本次關於Mapper接口的代理就到這裏了,謝謝大家。


一.關係梳理

 

二.Configuration

配置實體,可以理解爲讀取了xml配置文件後生成的配置實體。

三.MapperRegistry

是Configuration裏面的一個類變量,可用於掃描mapper接口時,通過addMapper方法加載Mapper的Bean到knowsMappers中。 這裏保存的是MapperProxyFactory,並非MapperProxy。

 

四.MapperProxyFactory

  1. 在“MapperRegistry”中用到,一個“MapperProxyFactory”對應一個mapperInterface。
  2. methodCache這個緩存對象會傳入到MapperProxy對象中,由MapperProxy進行寫入MapperMethod數據。
  3. 通過newInstance方法生成一個MapperProxy(Mapper代理)。
  4. 有2個newInstance方法,只有newInstance(SqlSession sqlSession)是對外開放的。

關於newInstance中的參數sqlSession是怎麼來的:

這裏涉及到spring加載dao層實體的流程,具體與“SqlSessionTemplate”、“MapperFactoryBean”、“MapperScannerRegistrar”等實現有關,這裏不細說,有興趣的同學可以通讀源碼瞭解。

 

五.MapperProxy

這個類實現了“InvocationHandler”接口進行反射操作。

反射操作invoke()中會拿到調用的MapperMethod對象,通過執行MapperMethod的execute方法完成用戶的命令

 

六.MapperMethod

1.MapperMethod在生成的時候已經確認“SqlCommand”,即sql的類型(增刪改查)。

2.在execute方法中,根據SqlCommand和傳入的參數,會選擇對應的具體(增刪改查)方法執行,並對結果進行加工,可以理解MapperMethod只是一個路由。

3.那麼在execute中執行sql,要怎麼與數據庫通信呢(事務、數據庫連接、Statement等等)?

(1)這就涉及到Mybatis中的一個核心了,就是SqlSession(會話)。在程序運行時,所有數據庫命令執行都是在SqlSession下進行的。
(2)SqlSession是一個接口,他的實現類有“DefaultSqlSession”,“SqlSessionManager”,“SqlSessionTemplate”。各自有自己的應用場景,
但是最終都是通過“DefaultSqlSession”去實現具體的數據庫訪問邏輯。

 

關於SqlSession的,會另起一篇文章介紹,本次關於Mapper接口的代理就到這裏了,謝謝大家。

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