mybatis源码阅读(动态代理)
这一篇文章主要是记录Mybatis的动态代理学习成果,如果对源码感兴趣,可以看一下上篇文章 https://www.cnblogs.com/ChoviWu/p/10118051.html
阅读本篇的读者应该都已经了解了用mapper调用xml下的内容是利用动态代理,本文将对这一部分的源码一探究竟
我们都知道,spring用bean注入的方式是以代理的方式注入的,那么当mapper调用更下游的(xml)的服务的时候,这个操作是怎么运作的呢?
在spring初始化bean的时候SqlsessionFactoryBean就已经把xml解析成mapper并储存在Configuration对象里,mapper下的所有接口都已经与xml的namespace匹配上,并且mapper注册为一个代理类
如下图:
将class的类作为key,所代理的对象作为value的HashMap数据结构存储
想必看了这么一点点可能有一点理解了,那么我们都知道,JDK 动态代理只能代理接口,而且还需要定义实现类,那 mybatis 是如何做到不需要实现类就轻松获取到代理对象的呢?
别急,看下方:
当mapper全部都作为knownMappes的键值时,用户调用Mapper的时候,经过了如下步骤:
看到这句想必就已经明白了!
这种方式类似于截获了真正的代理对象,主要目的其实是将sqlSession以及代理对象传输到mapperMethod,
而去执行其他的逻辑,通过MapperMethod实现数据库的访问操作
如果该方法继承自Object(意味着该操作是一个对象操作而不是一个接口),
如果是一个接口,将通过拿到的DefaultSqlSession执行该此操作
这里面的操作都是对sqlSession对Executor的调用下执行的sql