Mybatis源码解析-MapperProxy的创建

2022/3/10 9:14:48

本文主要是介绍Mybatis源码解析-MapperProxy的创建,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

基于SpringBoot的Mybatis源码解析:
SpringBoot版本如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

Mybatis版本如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

Mybatis的使用效果

先来看一下引入Mybatis的效果,studentDAO实际上是一个MapperProxy对象

通过debug进去之后,可以看到sqlSession的执行:

这一切是如何发生的呢?那就得从mybatis-spring-boot-starterspring.factories文件说起了。
可以看到Mybatis的自动化配置类是MybatisAutoConfiguration

源码解析

关键类的定义

MybatisAutoConfiguration类中声明SqlSessionFactorySqlSessionTemplate为bean

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


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

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

factoryBean初始化

将factoryBean包装后缓存

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

获取bean


填充属性

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


MapperProxyFactory代码如下:



这篇关于Mybatis源码解析-MapperProxy的创建的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程