springboot整合mybatis原理

pom

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

在mybatis-spring-boot-autoconfigure这个jar的spring.factories中
在这里插入图片描述
MybatisAutoConfiguration这个类注入了SqlSessionFactory和SqlSessionTemplate

MybatisAutoConfiguration有一个内部类比较重要
在这里插入图片描述
不存在MapperFactoryBean这个bean会导入AutoConfiguredMapperScannerRegistrar,
什么情况会存在MapperFactoryBean,使用@MapperScan注解会存在
原因如下:在这里插入图片描述
MapperScannerRegistrar的registerBeanDefinitions—》registerBeanDefinitions—》ClassPathMapperScanner的doScan—》processBeanDefinitions

processBeanDefinitions特别重要,此方法将@MapperScan注解需要扫描的包下的类的bean定义都变成MapperFactoryBean,如下图
在这里插入图片描述
在这里插入图片描述
MapperFactoryBean是做什么的呢?
spring在实例化mapper接口时,由于bean定义都被改为MapperFactoryBean,将会调用MapperFactoryBean的getObject方法,此方法中使用了SqlSessionTemplate(SqlSessionTemplate使用动态代理增强SqlSession),并使用动态代理创建了接口的代理类MapperProxy(实现InvocationHandler)

当不使用@MapperScan注解,即不存在MapperFactoryBean这个bean,MybatisAutoConfiguration会导入AutoConfiguredMapperScannerRegistrar,
此类的registerBeanDefinitions方法会扫描标注@Mapper注解的类,也是和上面@MapperScan一样,将bean定义修改

在这里插入图片描述
原理大概如此

简单了解下SqlSessionTemplate
在这里插入图片描述
在这里插入图片描述
上图的sqlSessionProxy即代理类,调用SqlSession的方法会调用SqlSessionInterceptor(实现了InvocationHandler),强调一点,SqlSessionInterceptor此类invoke调用的SqlSession的实例是从ThreadLocal里取出来的,有兴趣的可以翻看下源码,所以是线程安全的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值