mybatis-spring源码分析(有图解)

mybatis-spring源码分析(有图解)_第1张图片

springboot所有的中间件配置都是从 xxxAutoConfiguration开始的。mybatis也不例外。MybatisAutoConfiguration最重要的3个方法

mybatis-spring源码分析(有图解)_第2张图片

接下来按照执行顺序,逐一讲解

一、MapperScannerRegistrarNotFoundConfiguration

这个类不一定会执行,主要取决于

1、那么这个bean什么时候会有,什么时候会没有呢?这取决于你用什么方式扫描方式。我们通常有2种方式声明mapper:

    ①在启动类添加@MapperScan

        种就会生成MapperFactoryBean,也就是说用这种方式不会走这个静态内部类

   ②在每个mapper接口添加@Mapper

        用这种方式就会走这个静态内部类(本文主要介绍这种,其实2种最后都会走到同一个类里去)

PS: 如果你调皮2种都加,那么项目都启动不起来

2、这个静态内部类调用另一个静态内部类

实例化了一个classpathmapperscanner,指定了扫描注解类型(Mapper),并且进行扫描

mybatis-spring源码分析(有图解)_第3张图片

来看看doScan里做了什么

mybatis-spring源码分析(有图解)_第4张图片

扫描完mapper,紧接着又调用processBeanDefinitions

核心就以下两行,这里涉及到beandefinition和factorybean的知识。粗略来说,就是扫描获得每个mapper的beandefinition,然后把他的类型设置成mapperFactoryBean,并且设置构造函数参数。

mapperFactoryBean

mybatis-spring源码分析(有图解)_第5张图片

mybatis-spring源码分析(有图解)_第6张图片

mybatis-spring源码分析(有图解)_第7张图片

二、sqlSessionFactory

mybatis-spring源码分析(有图解)_第8张图片

factory.getObject一路点下去,点到buildSqlSessionFactory方法

该方法很长,但是核心的就是这一句。这句详细的我就不点进去了,大致是扫描我们写的xml文件,然后每一个sql都生成一个statement,这些statement存到configuration里,最后会把这个configuration放到sqlsessionfactory里,结束

mybatis-spring源码分析(有图解)_第9张图片

三、SqlSessionTemplate

mybatis-spring源码分析(有图解)_第10张图片

对动态代理熟悉的同学,肯定知道,精华就在invohandler里,进去看看吧

mybatis-spring源码分析(有图解)_第11张图片

我们重点看看执行sql时候的方法,由于sqlsession是一个接口,他的实现类是defaultsessionfactory,我们随便找一个方法看看

mybatis-spring源码分析(有图解)_第12张图片

这里从configuration里拿出statement,然后query方法一路跟下去,最终执行了jdbc

结语:本文是mybatis-spring大致流程

你可能感兴趣的:(java)