Spring Boot系列(三):Spring Boot整合Mybatis源码解析
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:27
一、Mybatis回顾
1、MyBatis介绍
Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记录。
2、Mybatis整体架构

二、Spring Boot整合Mybatis + Druid
1、在应用中导入maven依赖如下:
2、在应用中加配置
① 配置Druid数据源参数:
② 编写Druid数据源属性接收类:
③ 编写Druid数据源配置类:
3、在应用中加@MapperScan注解,他的主要作用就是扫描basePackage包下面的TobyMapper接口,然后getBean的时候通过JDK的动态代理,生成代理对象,所以我们程序中看到的是TobyMapper接口,其实是被动态代理过的。验证方式很简单,DEUBG到TobyMapper的方法里面,就可以发现其就是个动态代理
三、源码解析
1、Mybatis自动装配
自动装配的流程图:

具体详细见中的Spring Boot自动装配流程图。Mybatis的自动配置类给我们配置了什么组件,我们接下来看下MybatisAutoConfiguration类
① SqlSessionFactory:当容器中没有SqlSessionFactory这个类型的Bean的时候,Spring就加载该组件。

② SqlSessionTemplate:同样当容器中没有SqlSessionTemplate这个类型的Bean的时候,Spring就加载该组件。

到此SqlSessionFactory和SqlSessionTemplate组件有了。
2、@MapperScan注解
@MapperScan注解:他的作用就是扫描basePackages包下面的TobyMapper接口,然后getBean("tobyMapper")的时候把该接口通过JDK的动态代理,生成代理对象,用于和数据库打交道。
① 从@MapperScan入手:

② 导入了MapperScanner注册类MapperScannerRegistrar:
它是一个ImportBeanDefinitionRegistrar,Spring在通过@Import导入Bean的时候,会调用其registerBeanDefinitions,往Spring容器中注册bean定义信息,以便后面可以通过getBean获取到被注册进行的bean的定义信息所对应的Bean,其往Spring容器中注册的是MapperFactoryBean类型的Bean定义信息,为什么是MapperFactoryBean类型,而不是TobyMapper类型?原因很简单,Spring容器在getBean的时候,会忽略掉接口,接口是不能new的,而Spring容器默认在实例化的时候就是通过调用beanDefinition的beanClass属性所对应的类的无参构造方法。

③ 进去到注册bean定义信息的registerBeanDefinitions方法如下:

④ 进入到ClassPathMapperScanner的doScan,其作用是扫描basePackages所有的包,这里ClassPathMapper Scanner继承了Spring的包扫描ClassPathBeanDefinitionScanner

重写(覆盖)了判断是否是候选的Component方法isCandidateComponent,因为Spring默认的isCandidateComponent是会过滤掉接口的,显然不满足,所以重写了该方法
接下来进入到处理TobyMapper的bean的定义信息方法:

⑤ 处理TobyMapper的bean定义信息,主要由3个重要改动:
到此,扫描TobyMapper的时候,往Spring容器中注册的是beanClass为MapperFactoryBean,一个有参数的构造函数,按照类型注入的这么一个Bean定义信息。
3、通过getBean("tobyMapper")获取TobyMapper的动态代理类
我们知道,此时的tobyMapper的bean定义信息中的beanClass的属性是MapperFactoryBean.class,而MapperFactoryBean又是一个FactoryBean,FactoryBean的特点就是在getBean的时候会调用其getObject方法;
① 我们找到MapperFactoryBean的getObject方法:

② 我们再进入org.apache.ibatis.session.defaults.DefaultSqlSession#getMapper方法,其实已经到了Mybatis的逻辑了。

③ 最后调用到org.apache.ibatis.binding.MapperRegistry#getMapper,其实就是创建JDK的动态代理了。

代理的逻辑在org.apache.ibatis.binding.MapperProxy#invoke方法,到此tobyMapper创建完成,可以操作数据库。
四、扫描Mapper和Mapper动态代理对象生成流程图

- 上一篇: Spring Boot中@ConfigurationProperties注解实现原理源码解析
- 下一篇: Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!
相关文章
-
Spring Boot中@ConfigurationProperties注解实现原理源码解析
Spring Boot中@ConfigurationProperties注解实现原理源码解析
- 互联网
- 2026年04月04日
-
Spring Boot自动装配原理源码分析
Spring Boot自动装配原理源码分析
- 互联网
- 2026年04月04日
-
spring cloud feign 调用一直fallback
spring cloud feign 调用一直fallback
- 互联网
- 2026年04月04日
-
Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!
Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!
- 互联网
- 2026年04月04日
-
Spring Boot入门系列(二十)快速打造Restful API 接口
Spring Boot入门系列(二十)快速打造Restful API 接口
- 互联网
- 2026年04月04日
-
Spring Boot入门
Spring Boot入门
- 互联网
- 2026年04月04日






