Mybatis,生成動態代理
阿新 • • 發佈:2018-12-05
初始化的時候會解析<mappers>標籤,會放入到Configuration的mapperRegistry中的knownMappers:Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<>();
如圖1
第一種是設定了<package>,<package>和<mapper>不同同時設定。
第二種是設定了*.xml檔案,這種方式會繼續解析*.xml中的元素,如圖2,解析了完了會呼叫bindMapperForNamespace()方法放入knownMappers中,如圖3
第三種是直接設定了class
圖1:
圖2:
圖3
看下MapperRegistry是怎麼add
圖4
這裡有一個解析註解的動作,但是,如果前面已經解析過*.xml的話其實就不解析了
圖5
其實到這裡,解析完.*xml並把所有的型別都放到了knownMappers中,那在來看下圖5中MapperProxyFactory在初始化的時候做了些什麼事情:
圖6
把mapper的source型別賦給mapperInterface。
執行的時候,預設使用的是sqlSession的子類DefaultSqlSession,呼叫getMapper方法
圖7
從mapperRegistry中獲取
圖8
那麼在來看下mapperProxyFactory.newInstance(sqlSession),先例項化了一個MapperProxy,其實就是實現了InvocationHandler,這裡的mapperInterface,就是之前knownMappers載入型別
圖9
最後在通過動態代理返回,如圖10
圖10
到這裡,其實mybatis的動態代理生成接好了,在呼叫代理類的方法時會呼叫InvocationHandler的invoke方法,那麼下次再看在invoke是怎麼呼叫的。