1.Mybatis-starter模块介绍

我们知道Mybatis有两大核心组件:SqlSessionFactory和Mapper接口。该starter可以帮助我们自动完成SqlSessionFactory和Mapper的装配与注入,可以极大的简化我们的开发难度,提高开发效率。

Mybatis-starter主要完成以下功能:

  1. Autodetect an existing DataSource(自动发现存在的datasource)
  2. Will create and register an instance of a SqlSessionFactory passing that DataSource as an input using the SqlSessionFactoryBean(SqlSessionFactoryBean根据DataSource完成SqlSessionFactory实例的创建)
  3. Will create and register an instance of a SqlSessionTemplate got out of the SqlSessionFactory(根据SqlSessionFactory完成SqlSessionTemplate实例的创建与注册)
  4. Auto-scan your mappers,link them to the SqlSessionTemplate and register them to Spring context,so they can be injected into your beans(自动扫描mappers,关联于SqlSessionTemplate并注入Spring容器中以便其他beans使用)

2. Starter 自动装配解析

从该模块的pom文件可以看出,它里面引入了mybatis-spring-boot-autoconfigure依赖,由此我们可以知道在该依赖的META-INF目录下的spring.factories中配置了EnableAutoConfiguration的实现类,总共有2个分别是:MybatisLanguageDriverAutoConfiguration和MybatisAutoConfiguration。MybatisLanguageDriverAutoConfiguration主要是mapper配合注解方式编写sql语句,适用于简单的sql,一般不加载。

MybatisAutoConfiguration装配的条件是:

  1. 存在SqlSessionFactory和SqlSessionFactoryBean的class文件;
  2. 存在单个Datasource bean或者多个但是定义了primary datasource;
  3. 存在MybatisProperties配置文件;
  4. 在DataSourceAutoConfiguration和MybatisLanguageDriverAutoConfiguration初始化完成之后。

此外,在该配置类中注入了两个Bean,分别是SqlSessionFactory,该类是单个数据库经过编译之后内存的镜像,通过它可以于数据完成交互。另外一个是SqlSessionTemplate,该类封装了SqlSessionFactory和SqlSession,里面还定义了数据库操作方法,方便对数据进行操作。操作数据的类是一个代理类,代理的核心逻辑在SqlSessionInterceptor类中。该代理方法也很简单,首先获取SqlSession,之后调用method invoke方法。SqlSession的获取是以SqlSessionFactory为key去本地的ThreadLocal中获取,如果不存在就创建一个。

3.Mapper类扫描

在MybatisAutoConfiguration中有2个内部类,分别是:MapperScannerRegistrarNotFoundConfiguration和AutoConfiguredMapperScannerRegistrar,MapperScannerRegistrarNotFoundConfiguration的主要作用是ImportAutoConfiguredMapperScannerRegistrar,在方法registerBeanDefinitions中注册了MapperScannerConfigurer类,该类实现了BeanDefinitionRegistryPostProcessor接口,会在bean实例化之前调用postProcessBeanDefinitionRegistry方法

在processBeanDefinitions方法中,将beanDefinition的class替换成了MapperFactoryBeanClass的clas,MapperFactoryBeanClass是实现了FactoryBean,它里面有个getObject方法(getSqlSession().getMapper(this.mapperInterface)),该方法返回一个mapper 的代理对象MapperProxy,每次调用mappe 的方法都会去调用该类的invoke方法,最终调用MapperMethod的invoke方法,之后在调用mapperMethod的execute方法中,然后根据sql类型完成操作。

当我们查看@MapperScan注解时,发现它引入了MapperScannerRegistrar,该类实现了ImportBeanDefinitionRegistrar类,最终会调用RegisterBeanDefinitions方法,该方法与我们上面的解析流程一样。在MybatisAutoConfiguration配置类中,如果要让MapperScannerRegistrarNotFoundConfigurration配置生效,那么就需要不存在MapperScannerConfigurer的bean。因此该自动配置类与@MapperScan只能有一个生效,放置mapper重复扫描。

SpringBoot Mybatis Starter 解析相关推荐

  1. 【Springboot+mybatis】 解析Excel并批量导入到数据库

    [Springboot+mybatis] 解析Excel并批量导入到数据库 置顶 2018年01月16日 20:05:52 冉野丶 阅读数:4060 标签: excel导入数据库 文件上传 excel ...

  2. Springboot启动原理解析

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootAppl ...

  3. springboot + mybatis + gradle项目构建过程

    1.从Spring boot官网根据需求下载脚手架或者到GitHub上去搜索对应的脚手架项目,D_iao ^0^ • 文件目录如下(此处generatorConfig.xml 和 log4j2.xml ...

  4. SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...

  5. 高级面试题--SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...

  6. 亚信实习笔记总结(SpringBoot + MyBatis)

    1.工作内容描述?项目描述? 亚信公司简述   亚信公司主要是给运营商提供支撑服务.运营商包括(电信为主)江苏电信.湖北电信.海南电信.西藏电信.天津电信.黑龙江联通,提供的业务支撑系统包括计费.客户 ...

  7. SpringBoot+Mybatis配置Druid多数据源

    开篇之前,说一句题外话.多数据源和动态数据源的区别. 多数据源,一般用于对接多个业务上独立的数据库(可能异构数据库). 动态数据源,一般用于大型应用对数据切分. 配置参考 如何配置多数据源,网上教程一 ...

  8. SpringBoot+MyBatis+Shiro 搭建杂谈

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 链接:https://www.cn ...

  9. springboot mybatis 热加载mapper.xml文件(最简单)

    大家好,我是烤鸭: 今天介绍一下springboot mybatis 热加载mapper.xml文件. 本来不打算写的,看到网上比较流行的方式都比较麻烦,想着简化一下. 网上流行的版本. https: ...

  10. Springboot+Mybatis+PageHelper 分页、排序

    Springboot+Mybatis+PageHelper 分页.排序 升序 asc.降序 desc <!-- 继承 spring boot 父包--><parent>< ...

最新文章

  1. [Python Machine Learning] 学习笔记之scikit-learn机器学习库
  2. linux下gcc编译conio.h问题
  3. java服务器缓存_Java服务器缓存溢出有哪些呢、?
  4. 【python】sqlite使用
  5. JS循环执行函数setInterval
  6. qgis在地图上画导航线_在Laravel中的航线
  7. Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表
  8. 1003 C语言输入以某个特殊输入为结束标志
  9. python创意小作品-python turtle库的几个小demo
  10. 谈谈joomla1.5中个人遇见的古怪问题
  11. ISO27001认证适用领域及认证流程
  12. 最实用的正则表达式整理
  13. java分布式框架_5个强大的Java分布式缓存框架推荐
  14. 一维码二维码的生成及打印
  15. Commit cannot be completed since the group has already rebalanced and assign
  16. rust货轮什么时候出现_中国最早的汉字出现于什么时候?
  17. 华硕笔记本电脑重装系统后不能读取usb,不能上网
  18. Spark2.1.0 + CarbonData1.0.0集群模式部署及使用入门
  19. 百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析
  20. 中国海上风电行业十四五运维策略及供需形势分析报告2021-2027年

热门文章

  1. 地图“四色定理”的公式推导
  2. 【编程题m_0031】句子反转(小米2017秋招真题)
  3. 17AHU排位赛2 A题(最小生成树、LCA维护树上路径)
  4. xp系统打不开vba服务器,xp系统打不开360安全卫士的解决方法
  5. Altium Designer--如何将视图进行翻转(Flipped)
  6. 魔兽版无间道,5区一骗情骗装备的垃圾战士(zz)
  7. Android中Home键的监听和拦截
  8. java excel添加公式_Java 添加、读取 Excel 公式
  9. Win10安装Deepin双系统找不到启动项
  10. 1068 万绿丛中一点红(JAVA)