vlambda博客
学习文章列表

MyBatis结合Spring使用源码分析

上一篇内容主要分析了MyBatis的执行流程,项目中一般都是结合Spring一起使用。本次主要是分析下MyBatis结合Spring使用的源码。

不管是结合Spring使用还是单独使用MyBatis获取Mapper使用,主要是通过代理进行调用。如果理解了代理模式,那么这部分就会很好理解。如果不是很了解代理模式,没问题,继续往下看,会有简单的讲解。

官网中有如下示例,表示如何结合使用。

在源码的test目录下,sample包下有相关例子,本次通过test下的例子进行debug分析

MyBatis结合Spring使用源码分析

通过上面的配置文件,我们可以知道:

userMapper是org.mybatis.spring.mapper.MapperFactoryBean的实例

这里涉及spring的bean对创建,如果对于spring的源码较熟悉,这个流程理解起来就比较容易了。

简单解释,获取userMapper对象,通过MapperFactoryBean.getObject()方法进行获取。

直接看getObject()

MyBatis结合Spring使用源码分析

这个地方SqlSession的实现是SqlSessionTemplate,直接看Mapper实现


MyBatis结合Spring使用源码分析

MyBatis结合Spring使用源码分析

通过上面的代码可以看到是创建了MapperProxy的代理对象。

简单说下JDK动态代理,代理在调用的时候会调用我们写的InvocationHandler的实现的invoke方法,而invoke方法中可以在实际方法调用前后增加额外功能。

MyBatis结合Spring使用源码分析

上面是invoke方法,我们调用的方法是我们写的mapper的类,不是Object,走else。然后mapper里的方法是抽象的,所以最后会创建PlainMethodInvoker,而PlainMethodInvoker的invoke方法是调用MapperMethod的execute。

MyBatis结合Spring使用源码分析

MapperMethod这一看是不是熟悉了,里面调用SqlSession进行SQL的执行,而这个地方的SqlSession实现是SqlSessionTemplate,然后跟进去

MyBatis结合Spring使用源码分析

又是代理MyBatis结合Spring使用源码分析MyBatis结合Spring使用源码分析

莫慌,有了上面的经验吧继续invoke方法

MyBatis结合Spring使用源码分析

真正干活的是getSqlSession获取的SqlSession,继续跟

MyBatis结合Spring使用源码分析

嗯哼,熟悉了吧,和之前MyBatis就一样了。如果不熟悉,那么请看上一篇的。

下面简单解释下Spring的bean的创建过程以及autowire="byType"。

autowire="byType"则是在对对象进行属性填充的时候,解析出来其他的属性进行填充。如是官网图1中的例子则是直接根据配置的property进行属性填充。对于这部分不熟悉的,可以直接忽略,理解图1的即可。

MyBatis结合Spring使用源码分析

上图是spring bean创建过程 实例化、属性填充、初始化

上面说的autowire是在下面方法中解析出来SqlSessionFactory进行注入的。

MyBatis结合Spring使用源码分析

关于MyBatis-Spring使用分析结束了,主要是对代理模式的使用。通过这次的源码分析,对于代理模式的理解是不是又深了一点呢,我是有收获的,希望也能帮到你。

欢迎关注转发