1. 程式人生 > >Mybatis,生成動態代理

Mybatis,生成動態代理

  初始化的時候會解析<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是怎麼呼叫的。