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-starterspring.factories 文件说起了。
可以看到Mybatis的自动化配置类是MybatisAutoConfiguration

源码解析

关键类的定义

MybatisAutoConfiguration 类中声明SqlSessionFactorySqlSessionTemplate 为bean交给Spring容器管理。

此类中的静态内部类MapperScannerRegistrarNotFoundConfiguration 引入静态内部类AutoConfiguredMapperScannerRegistrar ;
AutoConfiguredMapperScannerRegistrar 实现了ImportBeanDefinitionRegistrar 接口的 registerBeanDefinitions 方法,扫描所有Mapper


将所有MapperbeanDefinition 标记为MapperFactoryBean 类型的,依赖注入方式为AUTOWIRE_BY_TYPE

MapperFactoryBean 实现了FactoryBean#getObject() 方法,这样当创建mapper对象时(如studentDAO )就会通过getObject() 方法来创建bean

factoryBean初始化

将factoryBean包装后缓存

容器的refresh() 方法里的invokeBeanFactoryPostProcessors 中,一层层下去...最后放在factoryBeanInstanceCache

获取bean

通过重写factoryBeangetObject 方法,调用sqlSession 来创建代理对象


填充属性SqlSessionFactorySqlSessionTemplate ,在他们的setter方法中会赋值给sqlSession ,后面创建代理对象的时候会用到


通过factoryBean的getObject() 方法获取代理对象:


MapperProxyFactory 代码如下: