首页 > 其他分享 >11.0 Spring整合Mybatis原理

11.0 Spring整合Mybatis原理

时间:2022-10-17 17:46:25浏览次数:82  
标签:对象 Spring 11.0 接口 Mybatis 执行 方法

一、整合核心思路

由很多框架都需要和Spring进行整合,而整合的核心思想就是把其他框架所产生的对象放到Spring容器中,让其成为Bean,只要成为了Bean,在Spring项目中就能很方便的使用这些对象了,也就能很方便的使用Mybatis框架所提供的功能了。

二、Mybatis-Spring 1.3.2源码执行流程

  1. 通过@MapperScan导入了MapperScannerRegistrar类
  2. MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,所以Spring在启动 时会调用MapperScannerRegistrar类中的registerBeanDefinitions方法
  3. 在registerBeanDefinitions方法中定义了一个ClassPathMapperScanner对象,用来扫描 mapper
  4. 设置ClassPathMapperScanner对象可以扫描到接口,因为在Spring中是不会扫描接口的
  5. 同时因为ClassPathMapperScanner中重写了isCandidateComponent方法,导致 isCandidateComponent只会认为接口是备选者Component
  6. 通过利用Spring的扫描后,会把接口扫描出来并且得到对应的BeanDefinition
  7. 接下来把扫描得到的BeanDefinition进行修改,把BeanClass修改为MapperFactoryBean,把 AutowireMode修改为byType
  8. 扫描完成后,Spring就会基于BeanDefinition去创建Bean了,相当于每个Mapper对应一个 FactoryBean
  9. 在MapperFactoryBean中的getObject方法中,调用了getSqlSession()去得到一个sqlSession 对象,然后根据对应的Mapper接口生成一个Mapper接口代理对象,这个代理对象就成为 Spring容器中的Bean
  10. sqlSession对象是Mybatis中的,一个sqlSession对象需要SqlSessionFactory来产生
  11. MapperFactoryBean的AutowireMode为byType,所以Spring会自动调用set方法,有两个set 方法,一个setSqlSessionFactory,一个setSqlSessionTemplate,而这两个方法执行的前提是 根据方法参数类型能找到对应的bean,所以Spring容器中要存在SqlSessionFactory类型的 bean或者SqlSessionTemplate类型的bean。
  12. 如果你定义的是一个SqlSessionFactory类型的bean,那么最终也会被包装为一个 SqlSessionTemplate对象,并且赋值给sqlSession属性
  13. 而在SqlSessionTemplate类中就存在一个getMapper方法,这个方法中就产生一个Mapper接 口代理对象
  14. 到时候,当执行该代理对象的某个方法时,就会进入到Mybatis框架的底层执行流程

Spring整合Mybatis之后SQL执行流程

三、Mybatis-Spring 2.0.6源码执行流程

  1. 通过@MapperScan导入了MapperScannerRegistrar类
  2. MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,所以Spring在启动 时会调用MapperScannerRegistrar类中的registerBeanDefinitions方法
  3. 在registerBeanDefinitions方法中注册一个MapperScannerConfigurer类型的 BeanDefinition
  4. 而MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口,所以 Spring在启动过程中时会调用它的postProcessBeanDefinitionRegistry()方法
  5. 在postProcessBeanDefinitionRegistry方法中会生成一个ClassPathMapperScanner对象,然 后进行扫描
  6. 后续的逻辑和1.3.2版本一样。 带来的好处是,可以不使用@MapperScan注解,而可以直接定义一个Bean,比如:
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
    MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
    mapperScannerConfigurer.setBasePackage("com.luban");
    return mapperScannerConfigurer;
}

四、Spring整合Mybatis后一级缓存失效问题

从Spring整合Mybatis之后SQL执行流程可知,Mybatis中的一级缓存是基于SqlSession来实现的,所以在执行同一个sql时,如果使用的是同一个 SqlSession对象,那么就能利用到一级缓存。 但是在Spring整合Mybatis后,如果执行某个方法时,该方法上没有加@Transactional注解,也就是没有开启Spring事务,每执行一个sql时都会新生成一个SqlSession 对象来执行该sql,这就是我们说的一级缓存失效(也就是没有使用同一个SqlSession对象)

其实这个不算问题,只是存在的生命周期太短了(执行完一个sql后就被销毁了,下一个sql执行时又 是一个新的SqlSession了)。

标签:对象,Spring,11.0,接口,Mybatis,执行,方法
From: https://www.cnblogs.com/ppku/p/16800002.html

相关文章

  • springboot集成minio及服务安装
    @​​TOC​​​​​​本文只介绍如何将minio做成服务​​1.将minio做成服务将MinioServer.exe放在minio安装目录中同目录下创建MinioServer.xml。特别注意,xml和exe必须同名......
  • Mybatis中判断集合的 size 不为空
    Mybatis中判断集合的size,可以用下面的方法来做。<iftest="null!=staffCodeListandstaffCodeList.size>0">andgui.USER_CODEnotin<foreachcollection="staf......
  • maven搭建多模块springboot项目微服务
    maven搭建多模块springboot项目微服务目录1.模块化概念2.搭建模块2.1创建父项目2.1.1创建新项目2.2添加子模块2.3修改父项目pom依赖2.3.1 父项目pom依赖说......
  • spring配置和管理bean
    Spring管理Bean-IOC在beans.xml中,我们注入2个Monster对象,但是不指定id<beanclass="com.hspedu.spring.beans.Monster"><propertyname="monsterId"valu......
  • SpringBoot异步线程,父子线程数据传递的5种方案
    背景在上一篇《SpringBoot+@Async开启异步,快的飞起(https://blog.51cto.com/u_15339304/5715380)》文章种我们介绍了使用springboot自定义线程池的方式实现多线程的异步......
  • Spring线程池
    介绍本文介绍如何使用Spring中的线程池。bean配置[codesyntaxlang="xml"]<beanclass="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><proper......
  • Mybatis
    Mybatis简化jdbc,免除了几乎所有jdbc代码以及设置参数和获取结果集的工作。将注册驱动、获取连接的语句放在xml里设置好。sql语句也设置好。搭建环境流程:1.创建maven工......
  • SpringMVC(一):SpringMVC的执行流程
    先看一张图:从这张图我们可以很直观地看出来,SpringMVC的执行流程大致分为以下几步:1.用户发起的请求被前端控制器DispatcherServlet接收;2.DispatcherServlet调用处理映射......
  • Spring boot 、Spring Data REST、Swagger3
                整合swagger3   ......
  • windows minio服务安装以及springboot集成
    @​​TOC​​​​​​本文只介绍如何将minio做成服务​​1.将minio做成服务将MinioServer.exe放在minio安装目录中同目录下创建MinioServer.xml。特别注意,xml和exe必须同名......