SpringBoot Mybatis Starter 解析

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重复扫描。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值