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是怎么调用的。

猜你喜欢

转载自www.cnblogs.com/shenqiaqia/p/10072710.html