mybatis-spring源码分析
springboot所有的中间件配置都是从 xxxAutoConfiguration开始的。mybatis也不例外。MybatisAutoConfiguration最重要的3个方法
接下来按照执行顺序,逐一讲解
一、MapperScannerRegistrarNotFoundConfiguration
这个类不一定会执行,主要取决于
1、那么这个bean什么时候会有,什么时候会没有呢?这取决于你用什么方式扫描方式。我们通常有2种方式声明mapper:
①在启动类添加@MapperScan
种就会生成MapperFactoryBean,也就是说用这种方式不会走这个静态内部类
②在每个mapper接口添加@Mapper
用这种方式就会走这个静态内部类(本文主要介绍这种,其实2种最后都会走到同一个类里去)
PS: 如果你调皮2种都加,那么项目都启动不起来
2、这个静态内部类调用另一个静态内部类
实例化了一个classpathmapperscanner,指定了扫描注解类型(Mapper),并且进行扫描
来看看doScan里做了什么
扫描完mapper,紧接着又调用processBeanDefinitions
核心就以下两行,这里涉及到beandefinition和factorybean的知识。粗略来说,就是扫描获得每个mapper的beandefinition,然后把他的类型设置成mapperFactoryBean,并且设置构造函数参数。
至于mapperFactoryBean里头干了啥我们一会再说!!!
二、sqlSessionFactory
factory.getObject一路点下去,点到buildSqlSessionFactory方法
该方法很长,但是核心的就是这一句。这句详细的我就不点进去了,大致是扫描我们写的xml文件,然后每一个sql都生成一个statement,这些statement存到configuration里,最后会把这个configuration放到sqlsessionfactory里,结束
三、SqlSessionTemplate
对动态代理熟悉的同学,肯定知道,精华就在invohandler里,进去看看吧
我们重点看看执行sql时候的方法,由于sqlsession是一个接口,他的实现类是defaultsessionfactory,我们随便找一个方法看看
这里从configuration里拿出statement,然后query方法一路跟下去,最终执行了jdbc
结语:本文是mybatis-spring大致流程,后续补一张图更清晰一点。TODO