Mybatis与Spring集成过程
近期准备做一下Mybatis的源码解读,整个系列大概会有6-7篇文章。
先释放一下目录:
1.Mybatis框架组件设计&顶层接口
2.Mybatis框架启动流程分析
3.Mybatis框架源码Configuration分析
4.Mybatis框架一条插入语句的执行流程
5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全?
6.Mybatis框架一条查询语句的执行流程
7.Mybatis的日志&异常体系
8.Mybatis与Spring集成过程
9.Mybatis的CRUD代码生成
好吧,说好的6-7篇,一不小心写多了几个,现在继续Mybatis之旅,一般情况下写项目很少单独使用Mybatis框架,基本会基于Spring框架做整合,目前Mybatis+spring作为项目技术组件选型在国内还是很受欢迎的,相关的整合教程也有很多,所以这里不会单独列文章去说这块的内容,笔者曾经在学习的过程中也经常搜这方面的文章,自己搭建demo。因此如果使用框架搭建项目的话一般不会遇到太多问题,这里我们稍微深入探讨一些原理性的东西。
首先clone:https://github.com/mybatis/spring.git,将mybatis整合spring的项目代码down到本地。
整体看整合的内容不是很多,大概分为以下几大块
- 接口包扫描 Bean注册
- sqlsession Bean注册
- 数据源&事务兼容
下面将分三块内容说明mybatis整合spring的大体方案
1. 接口包扫描 Bean注册
这里的接口包扫描指扫描XXXMapperDAO接口,将创建的代理类注入springbean管理体系,注册扫描的包方式总体有两种。
一种是通过MapperScan注解的方式去标注要扫描的接口包,
另一种是通过xml标签的方式标注要扫描的接口包。
扫描注册bean的类有以下几个:
org.mybatis.spring.annotation.MapperScannerRegistrar
org.mybatis.spring.config.MapperScannerBeanDefinitionParser
org.mybatis.spring.mapper.ClassPathMapperScanner
org.mybatis.spring.mapper.MapperScannerConfigurer
我们跑几个Test Case看一下:
1.org.mybatis.spring.annotation.MapperScanTest#testAnnotationScan
注册入口.png beandefinition定义.png
准备扫描.png
扫描注册BeanDefinition.png
2.sqlsession Bean注册
关于sqlSession Bean注册有如下几个类:
org.mybatis.spring.SqlSessionFactoryBean
org.mybatis.spring.SqlSessionHolder
org.mybatis.spring.SqlSessionTemplate
org.mybatis.spring.SqlSessionUtils
我们重点关注一下这个方法:org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory
这个方法使用了很多java8的语法特性重新构建了Mybatis 的Configuration对象。
我们使用这个Test Case :org.mybatis.spring.SqlSessionFactoryBeanTest#testDefaults()
configurationinit08.png
3.数据源&事务兼容
spring提供了通用的事务处理服务,因此可以将mybatis的数据源和事务相关的逻辑迁移到spring管理,这里相关的类有:
org.mybatis.spring.transaction.SpringManagedTransaction
org.mybatis.spring.transaction.SpringManagedTransactionFactory
整体就是一个事务工厂,SpringManagedTransactionFactory创建SpringManagedTransaction。
相关的case也比较简单,可以参考org.mybatis.spring.transaction.SpringTransactionManagerTest类。