Mybatis-SpringBoot源码解析
关键类
MybatisProperties
org.mybatis.spring.boot.autoconfigure.MybatisProperties
MyBatis 的配置类,通过 Spring Boot 中的 @ConfigurationProperties 注解,注入 MyBatis 的相关配置
这里注意到仅添加了 @ConfigurationProperties 注解,在作为 Spring Bean 注入到 Spring 容器中时,会将相关配置注入到属性中,但是这个注解不会将该类作为 Spring Bean 进行注入,需要结合 @Configuration 注解或者其他注解一起使用
MybatisAutoConfiguration
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
实现 InitializingBean 接口,MyBatis 自动配置类,用于初始化 MyBatis,核心类
类上面定义的几个注解:
@Configuration:可以当作一个 Spring Bean 注入到 Spring 上下文中@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })保证存在 value 中所有的 Class 对象,以确保可以创建它们的实例对象,这里就保证 SqlSessionFactory 和 SqlSessionFactoryBean 都能够被创建@ConditionalOnSingleCandidate(DataSource.class)保证存在 value 类型对应的 Bean,这里确保已经存在一个 DataSource 数据源对象@EnableConfigurationProperties(MybatisProperties.class)注入 value 中所有的类型的 Bean,这里会让 MybatisProperties 作为 Spring Bean 注入到 Spring 上下文中
SqlSessionTemplate
org.mybatis.spring.SqlSessionTemplate:实现 SqlSession 和 DisposableBean 接口,SqlSession 操作模板实现类 实际上,代码实现和 org.apache.ibatis.session.SqlSessionManager 相似,承担 SqlSessionFactory 和 SqlSession 的职责
SqlSessionInterceptor
SqlSessionTemplate的内部类,实现了 InvocationHandler 接口,作为sqlSessionProxy动态代理对象的代理类,对 SqlSession 的相关方法进行增强
MapperFactoryBean
扫描 Mapper 接口时生成的BeanDefinition对象,通过这个对象,spring生成bean的过程完成了Mapper 动态代理对象的创建。
创建MappedStatement
MapperFactoryBean的父类DaoSupport中实现了InitializingBean接口,在创建bean,初始化时会调用checkDaoConfig方法来生成MappedStatement放在全局配置类Configuration中。
创建Mapper代理类
MapperFactoryBean 实现了FactoryBean接口,在spring框架初始化时,会通过FactoryBean#getObject生成并获取Mapper接口的代理对象。
getObject通过getSqlSession 方法获取父类SqlSessionDaoSupport中的sqlSessionTemplate,通过sqlSession生成并获取Mapper接口的代理对象。
@MapperScan注解
Spring boot中,配置了@Mapper注解的Mapper接口才会被解析,一般有四个路径:
配置
MapperScannerConfigurer扫描器类型的 Spring Bean@MapperScan注解<mybatis:scan />标签若没有配置上面三种方式则通过
AutoConfiguredMapperScannerRegistrar添加MapperScannerConfigurer,然后扫描Spring Boot的基础包路径去获取Mapper接口。
org.mybatis.spring.annotation.MapperScannerRegistrar作为@MapperScan的注册器。
MapperScannerRegistrar 实现了 ImportBeanDefinitionRegistrar接口,在Spring Boot创建bean时,调用方法registerBeanDefinitions创建了MapperScannerConfigurer对象,MapperScannerConfigurer使用@MapperScan注解信息去扫描Mapper接口。
MapperScannerConfigurer扫描到的所有扫描到的 Mapper 接口的BeanDefinition对象(Spring Bean的前身),并将其 Bean Class 修改为MapperFactoryBean,从而在 Spring 初始化该 Bean 的时候,会初始化成MapperFactoryBean类型,实现创建 Mapper 动态代理对象
AutoConfiguredMapperScannerRegistrar
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.AutoConfiguredMapperScannerRegistrar
是MybatisAutoConfiguration 的一个内部静态类。
通过org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.MapperScannerRegistrarNotFoundConfiguration导入该bean(通过条件注解判断了不存在另外三种路径的前提)。