Mybatis的實現原理


在spring啟動的時候,spring會根據我們配置的有關mapper.xml的路徑加載此路徑下的xml文件,得到一個List<Resource>的集合,然后將這個集合轉化成Resource[]數組賦值到SqlSessionFactoryBean中的mapperLocations(其實也是一個Resource[])

帶目前位置這些mapper的配置文件就被維護到一個SqlSessionFactoryBean中了,然后調用SqlSessionFactoryBean的getObject()方法通過buildSqlSessionFactory()方法創建一個SqlSessionFactoryBean實例,在調用buildSqlSessionFactory的時候,會創建一個XMLConfigBuilder對象然后獲取一個configuration類型的對象,這個對象很關鍵,后面會用到,接着會對mapperLocations進行循環,然后使用XMLMapperBuilder對每個mapperLocations的流解析成document對象,接着會調用XMLMapperBuilder的parse()方法解析對document對象的每個結點並生成對象,當然在解些此resource的時候會判斷configuration對象中是否已經有此resource,如果有就不解析如果沒有才會解析,並將解析完的各個子結點放入到configuration中,其實就是放到不同的map集合中,而我們常見的insert,update等結點,會被維護到一個Map<String, MappedStatement> mappedStatements的map中,key就是namespace加上標簽的id(例如:com.org.userMapper.selectOne之所以這樣做是為了保證key的唯一性),value中存的MappedStatement對象其實就是對sql標簽解析的結果,到這里mapper.xml就解析完成了,然后會將configuration作為參數通過DefaultSqlSessionFactory來創建一個sqlsessionFactory的實例對象,而對於解析失敗的會進行循環處理處理,最后是通過namaspace維護到一個configuration中的一個類型為MapperRegistry對象中,而mapperRegistry

會調用addmapper方法把這個mapper維護到一個Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap()中,這個knownMappers 非常重要,他會在我們對接口進行調用的時候通過動態代理獲取mapper接口實例,找到我們要找到的sql,當然在找到mapper實例之后還要經過一系列的參數處理器,sql處理器,然后選擇合適的執行器,最后執行器將結果交給執行結果處理器處理返回給sqlsession。

 

動態代理的過程

通過接口的calss文件類型從knownMappers中獲取一個mapper的代理工廠,在MapperProxyFactory代理工廠同調用newInstance()方法通過sqlsession實例和接口類型還有methodCach獲取MapperProxy實例,然后再通過jdk動態代理來生成我們想要代理類

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM