Mybatis源码解析-MapperProxy的创建
基于SpringBoot的Mybatis源码解析:
SpringBoot版本如下:
    
        org.springframework.boot 
        spring-boot-starter-parent 
        2.5.2 
         
Mybatis版本依赖如下:
        
            org.springframework.boot 
            spring-boot-starter-jdbc 
         
        
            org.mybatis.spring.boot 
            mybatis-spring-boot-starter 
            1.3.3 
         
        
            mysql 
            mysql-connector-java 
            runtime 
         
Mybatis的使用效果
先来看一下引入Mybatis的效果,studentDAO 实际上是一个MapperProxy 对象
通过debug进去之后,可以看到sqlSession的执行:
这一切是如何发生的呢?那就得从mybatis-spring-boot-starter 的spring.factories 文件说起了。
可以看到Mybatis的自动化配置类是MybatisAutoConfiguration 。
源码解析
关键类的定义
MybatisAutoConfiguration 类中声明SqlSessionFactory 和SqlSessionTemplate 为bean交给Spring容器管理。
此类中的静态内部类MapperScannerRegistrarNotFoundConfiguration 引入静态内部类AutoConfiguredMapperScannerRegistrar ;
AutoConfiguredMapperScannerRegistrar 实现了ImportBeanDefinitionRegistrar 接口的 registerBeanDefinitions 方法,扫描所有Mapper
将所有Mapper 的beanDefinition 标记为MapperFactoryBean 类型的,依赖注入方式为AUTOWIRE_BY_TYPE 。
MapperFactoryBean 实现了FactoryBean#getObject() 方法,这样当创建mapper对象时(如studentDAO )就会通过getObject() 方法来创建bean
factoryBean初始化
将factoryBean包装后缓存
容器的refresh() 方法里的invokeBeanFactoryPostProcessors 中,一层层下去...最后放在factoryBeanInstanceCache 里
获取bean
通过重写factoryBean 的getObject 方法,调用sqlSession 来创建代理对象
填充属性SqlSessionFactory 和SqlSessionTemplate ,在他们的setter方法中会赋值给sqlSession ,后面创建代理对象的时候会用到
通过factoryBean的getObject() 方法获取代理对象:
MapperProxyFactory 代码如下: