我們知道通過初始化了SqlSessionFactory之后可以實例化出一個默認的DefaultSqlSessionFactory。那么通過這個全局唯一的單利工廠,可以生成我們每次需要使用的sqlsession會話實例
源碼分析如下:

我們知道sqlSessionFactory接口有以下方法

而mybatis默認實現(xiàn)類是DefaultSqlSessionFactory,接下去看一下這個實現(xiàn)類的真面目


這里簡單說一下,mybatis的三種執(zhí)行器類型
ExecutorType 枚舉類
????SIMPLE:簡易執(zhí)行器,不配置就采用這種
????REUSE:一種執(zhí)行器重用預處理語句
????BATCH:執(zhí)行器重用語句和批量更新,專門針對批量專用的執(zhí)行器
mybatis會根據(jù)執(zhí)行器類型去初始化不同的執(zhí)行器Executor。后面會說明Executor在mybatis執(zhí)行過程中的作用是什么。
繼續(xù)往下看



簡要分析:
? ? 1:通過從環(huán)境中獲取到其中的事物工廠,并通過該事物工廠每次都new一個事物。
? ? 2:通過執(zhí)行器類型初始化不同的執(zhí)行器
? ? 3:初始化DefaultSqlSession
獲取到sqlsession之后,就是調(diào)用sqlsession的getMapper方法去獲取到映射器的實例。
下面重點分析 sqlSession.getMapper(Class class)

再繼續(xù)向下看,找到Configuration.getMapper(type, sqlsession);





下面重點分析這個方法:
? ? 1:簡單分析一下,通過映射器的Class type去knownMappers這個HashMap中找到對應的MapperProxyFactory實例
? ? 2:通過MapperProxyFactory去獲取一個映射器的代理類 mapperProxyFactory.newInstance(sqlsession);

該方法分兩步:
? ? 1:首先 new 一個MapperProxy實例出來,這個實例是做什么的呢?繼續(xù)查看MapperProxy的源碼
? ? 2:將該MapperProxy實例作為一個handler去調(diào)用Proxy的newProxyInstance方法。真正生成該映射器的代理類$Proxy0。

原來這個MapperProxy實例就是一個InvocationHandler,通過jdk動態(tài)代理會生成一個該映射器的代理類,并在代理類的構(gòu)造函數(shù)中將該handler初始化傳入,最終在這個UserMapper映射器的代理類上執(zhí)行一系列方法時,會最終執(zhí)行該handler的invoke方法,