SpringBoot中MyBatis的Mapper的原理

SpringBoot中MyBatis Mapper的原理核心是动态代理Spring自动配置 。通过@MapperScan@Mapper注解,Spring启动时扫描接口,利用MapperFactoryBean和JDK动态代理将接口注册为Spring Bean,并由MapperProxy在运行时生成Mapper实例,将方法调用转化为SQL执行。 一、 核心工作原理

  1. 扫描与定义 (Scanning & Definition) :

    • SpringBoot启动时,@MapperScan注解或MybatisAutoConfiguration会扫描指定包下的Mapper接口。
    • 扫描到的接口并不会直接被实例化(因为它是接口),而是将其BeanDefinition注册到Spring容器中,定义其Bean类型为MapperFactoryBean
  2. 动态代理生成 (Dynamic Proxy Generation) :

    • MapperFactoryBean实现了Spring的FactoryBean接口。当容器需要该Mapper时,getObject()方法被调用。
    • 使用JDK动态代理 (Proxy.newProxyInstance),以Mapper接口为代理接口生成一个代理对象。
    • 这个代理对象中绑定了MapperProxy工厂,它会创建实际执行SQL的代理实例。
  3. 方法调用执行 (Method Execution) :

    • 在Service层注入Mapper接口并调用方法(如userMapper.selectById(1))时,实际执行的是MapperProxyinvoke方法。
    • MapperProxy会根据方法名找到MyBatis中配置的对应SQL语句(XML或注解)。
    • 最终通过SqlSession执行SQL、映射结果对象(ResultMap)并返回。

二、 关键组件

  • @MapperScan / @Mapper: 标识Mapper接口位置,供扫描器识别。

  • MapperFactoryBean: 将Mapper接口转变为Spring Bean的关键中间件。

  • MapperProxyFactory : 产生MapperProxy实例。

  • MapperProxy : 实现InvocationHandler,是真正实现SQL映射的逻辑中心。

三、 整合原理图示

rust 复制代码
Service --> Mapper接口 (Proxy) 
             |
             v
MapperProxy (处理调用,匹配SQL)
             |
             v
SqlSession --> Executor --> JDBC --> 数据库

四、 @Mapper 与 @MapperScan 的区别

  • @Mapper: 需要在每一个Mapper接口上标注,比较繁琐。
  • @MapperScan: 在配置类上使用,批量扫描指定包下的所有接口,无需每个接口加注解。
相关推荐
前端环境观察室3 小时前
别只看 task success:AI Agent 浏览器自动化真正要补的是环境证据链
前端·后端
浩风祭月3 小时前
把 Docker 镜像从 2GB 瘦身到 180MB,AI 帮我找到了那些看不见的“脂肪”
后端·ai编程
暗冰ཏོ4 小时前
Go 语言从入门到后端项目实战完整指南
开发语言·后端·golang·go·go语言
霸道流氓气质5 小时前
Windows批处理脚本完整指南:可移植的交互式SpringBoot项目管理
windows·spring boot·后端
小杍随笔5 小时前
【Rust 工具链管理完全指南:rustup toolchain 命令实战详解】
开发语言·后端·rust
还是鼠鼠5 小时前
AI掘金头条新闻系统 (Toutiao News)-获取用户信息
后端·python·mysql·fastapi·web
BingoGo5 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.3.1 发布 后台打包直降 5s 内
后端·php
JaguarJack5 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.3.1 发布 后台打包直降 5s 内
后端·php·laravel
小张小张爱学习6 小时前
Spring Boot 多线程并发入门教程:ThreadPoolTaskExecutor + CompletableFuture
java·spring boot·后端
西安邮电大学6 小时前
Redis核心数据结构以及应用场景
java·redis·后端·其他·面试