Mybatis,生成动态代理
Posted 神恰恰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是怎么调用的。
以上是关于Mybatis,生成动态代理的主要内容,如果未能解决你的问题,请参考以下文章