MyBatis-原理

创建mapper代理对象

Posted by LQFGH on February 1, 2019

总结

这里将总结放到前面的目的就是希望读者可以先了解整个的流程和重要代码的意义,以免在具体看的时候迷失方向

在这个过程中还是希望读者可以跟随本文打断点亲自看下源码,体会很更深些

SqlSession 初始化过程时序图

  • Configuration:保存configuration配置文件中所有的配置文件
  • DefaultSqlSessionFactory 创建SqlSession 的工厂类
  • Executor 是执行增删改查等方法最基础的方法,底层执行增删改查还是要调用Executor的类的方法的实现

简单的运行代码

由于是看源码,这里的只有两个查询方法和非常简单的配置

全局配置文件

mapper 接口

mapper 配置文件

测试类

测试类中的 sqlSession.getMapper处打断点,作为程序的入口


断点走走

调用 sqlSession.getMapper

进入 sqlSession.getMapper(EmployeeMapper.class) 方法看到调用的是 sqlSession

中 configuration 的 getMapper 方法

调用 configuration 的 getMapper 方法

我们发现在 configuration 中调用的是其属性 mapperRegistry 的 getMapper 方法,那 mapperRegistry是什么呢?

实际上 mapperRegistry中存放的是接口和创建其代理的工厂的 knownMappers

mapperRegistry 是创建 sqlSesssionFactory 时创建的

接下来进入 getMapper 方法

MapperProxyFactory 中获取 MapperProxy 代理

正如上面所说,45 行从 knownMappers 中的 knownMappers 中获取 MapperProxyFactory

50 行 从 MapperProxyFactory 中获取 MapperProxy 对象

接下来进入 MapperProxyFactory

MapperProxyFactory 中创建 MapperProxy 代理

图中51 行处创建 MapperProxy 对象

52 行调用46行的 newInstance 方法

47行调用原生的jdk 的 Proxy 类创建代理对象

接下来进入51 行看看 MapperProx 是什么

MapperProxy 代理类

图中30 行,MapperProxy 实现了 jdk 原生的代理接口

实现了 invoke 方法,在调用代理对象的方法时会调用 invoke方法

至此创建代理对象完毕,一步步将代理对象返回