Spring如何管理Mapper

目录

  • 一、背景
  • 二、猜测
  • 三、源码查看步骤
    • 1、创建MapperScannerConfigurer.java
    • 2、@MapperScan注解
    • 3、MapperScannerRegistrar执行registerBeanDefinitions方法
    • 4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法
    • 5、执行doscan
    • 6、设置beanClass
    • 7、使用jdk生成代理类

一、背景

在Controller中使用Service,一般是实现Service接口类上添加@Service注解,让实现类注入到SpringIoc容器中,Controller通过@Autowired 从容器中获取,但是在Service实现类中使用@AutoWired 获取Mapper的时候,没有看到Mapper的实现类,带着疑问查看Spring是如何把Mapper接口类型的类注入到Ioc容器中。

二、猜测

Spring的bean生成过程 。 Spring启动过程中,大致会经过如下步骤去生成bean:
扫描@ComponentScan中指定的包路径下的class文件
根据class信息判断是否符合生成对应的BeanDefinition的条件**(接口和抽象类不符合条件)**,如果符合则生成对应的BeanDefinition
在此处,程序员可以利用某些机制去修改BeanDefinition,实现扩展
根据BeanDefinition中的class信息反射生成bean实例
把生成的bean实例放入Spring容器中由此步骤可见,要想生成bean对象,首先需要有BeanDefinition。经过查阅资料发现是MapperScannerConfigurer.java类扫描Mapper,生产BeanDefinition,并把BeanClass设置成MapperFactoryBean,通过MapperFactoryBean生成的代理类。

三、源码查看步骤

1、创建MapperScannerConfigurer.java

springboot自动配置可以有多种方法创建MapperScannerConfigurer.java,我看的是若依框架中通过@MapperScan引入的方式。

2、@MapperScan注解

@MapperScan注解中@Import(MapperScannerRegistrar.class)引入了MapperScannerRegistrar
在这里插入图片描述

3、MapperScannerRegistrar执行registerBeanDefinitions方法

MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar(此接口一般配合@Import使用)接口所以会执行registerBeanDefinitions,registerBeanDefinitions方法中往BeanDefinitionRegistry中添加了MapperScannerConfigurer的类的描述,spring会根据BeanDefinition创建MapperScannerConfigurer。
在这里插入图片描述

4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法

MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor(此接口和ImportBeanDefinitionRegistrar区别 )接口会执行postProcessBeanDefinitionRegistry方法,postProcessBeanDefinitionRegistry这个方法会扫描配置的mapper接口路径下所有mapper接口类生成BeanDefinition。
在这里插入图片描述

5、执行doscan

MapperScannerConfigurer的父类ClassPathMapperScanner,爷类ClassPathBeanDefinitionScanner中doscan会根据配置mapper接口路径读取文件生成BeanDefinition类的集合。
在这里插入图片描述

6、设置beanClass

回到ClassPathMapperScanner执行processBeanDefinitions遍历所有beanDefinition集合把beanClass为MapperFactoryBean类型。
在这里插入图片描述

7、使用jdk生成代理类

MapperFactoryBean实现了FactoryBean,所以在Spring创建mapper类时会调用getObject方法,执行流程DefaultSqlSession中getMapper->configuration.getMapper->MapperRegistry.getMapper->MapperProxyFactory.newInstance(sqlSession),使用jdk动态代理生成mapperProxy。
在这里插入图片描述
knownMappers结合中的数据是初始化configuration的时候添加进去的,有兴趣的可以断点查看configuration初始化过程。在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3249731.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

sql常见50道查询练习题

sql常见50道查询练习题 1. 表创建1.1 表创建1.2 数据插入 2. 简单查询例题(3题)2.1 查询"李"姓老师的数量2.2 查询男生、女生人数2.3 查询名字中含有"风"字的学生信息 3. 日期相关例题(6题)3.1 查询各学生的年龄3.2 查询本周过生日的…

解决:Linux上SVN 1.12版本以上无法直接存储明文密码

问题:今天在Linux机器上安装了SVN,作为客户端使用,首次执行SVN相关操作,输入账号密码信息后,后面再执行SVN相关操作(比如"svn update")还是每次都需要输入密码。 回想以前在首次输入…

Typora 1.5.8 版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora是一款基于Markdown语法的轻量级文本编辑器,它的主要目标是为用户提供一个简洁、高效的写作环境。以下是Typora的一些主要特点和功能: 实时预览:Typora支持实时预览功能&#xff0…

云监控(华为) | 实训学习day3(10)

实现数据的增删改查 SpringBoot框架模式 向送外卖一样理解 写程序 1、准备食材(java bean) 2、菜谱(pojo接口->预制->sql 语句) 3、service处理 4、controller 派送 5、用户请求->页面 一、Spring Boot实现增加 第一步:食材(表),用户增加,这里还是用户…

使用Python和Pandas进行数据分析:入门与实践

目录 引言 准备工作 安装Python与Pandas 导入Pandas库 Pandas基础 数据结构 创建Series和DataFrame 读取数据 数据探索 查看数据 数据清洗 数据可视化 实战案例:分析销售数据 引言 在当今数据驱动的时代,数据分析已成为各行各业不可或缺的…

如何高效定制视频扩散模型?卡内基梅隆提出VADER:通过奖励梯度进行视频扩散对齐

论文链接:https://arxiv.org/pdf/2407.08737 git链接:https://vader-vid.github.io/ 亮点直击: 引入奖励模型梯度对齐方法:VADER通过利用奖励模型的梯度,对多种视频扩散模型进行调整和对齐,包括文本到视频和…

机器学习的持续交付-CD4ML 端到端自动化构建部署机器学习应用

机器学习的持续交付-CD4ML 端到端自动化构建部署机器学习应用 原文:Continuous Delivery for Machine Learning - CD4ML 关键字:持续部署、持续交付、机器学习、CD4ML 作者:Danilo Sato, Arif Wider, Christoph Windheuser 译者:周…

synergy配置

今天介绍一个电脑同步软件synergy。 我们开发时一般会用两套设备,如果使用两套键盘操作起来会很麻烦,这个软件就是解决这个问题,可以使用一套键盘同时操作两台电脑,另一台作为客户端被控制。 安装 在两台电脑上各自下载安装syne…

55 TCP协议

目录 协议段格式确认应答(ACK)机制序号标志位超时重传连接管理机制延迟应答捎带应答流量控制滑动窗口拥塞控制面向字节流粘包问题异常情况小结文件和socket的关系基于tcp应用层协议udp和tcp对比udp实现可靠传输 全称为“传输控制协议(Transm…

【BUG】已解决:note: This is an issue with the package mentioned above,not pip.

已解决:note: This is an issue with the package mentioned above,not pip. 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷…

ELK 8.14版本搭建

1.架构图 2.基础环境准备: 2.1 关闭防火墙和selinux [rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config [rootlocalhost ~]# cat /etc/selinux/config # This file controls the state of SEL…

手机恢复回收站清空的照片,3个方法与注意事项【小米/华为/vivo】

你们是否曾遭遇过这样的困境:清空回收站后,突然发现其中有几张非常重要的照片?那种懊悔与焦虑,简直可以写成一部“手机用户的心酸史”。这篇文章来拯救你啦!恢复回收站清空的照片的方法可不少,究竟是哪3个方…

uni-app开发日志:unicloud使用时遇到的问题解决汇总(不断补充)

插件安装后提示与原数据库表冲突(2024.7.18) 安装uni-admin后再安装uni-cms,在uni-admin中添加好菜单,结果提示该错误 回到hbuilder中uniCloud/database中找到冲突的部分 比较一下,选中老的删除 opendb-news-articl…

【转盘案例-弹框-修改Bug-完成 Objective-C语言】

一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…

maven项目打成可运行的jar及pom中的依赖一同打包

maven项目打jar及pom中的依赖一同打包 最近开发中有个需求,不部署新的服务,只jar包执行 那maven项目中,代码如何以jar的方式运行、如何把代码打成jar、pom中的依赖如何与代码一同打到jar包中? 1、代码如何以jar的方式运行&…

222.买卖股票的最佳时机(力扣)

代码解决 class Solution { public:int maxProfit(vector<int>& prices) {// 初始化最小买入价为第一个价格int min1 prices[0];// 初始化最大利润为0int max1 0;// 从第二天开始遍历价格数组for (int i 1; i < prices.size(); i) {// 计算当前价卖出的利润&a…

FastAPI 学习之路(五十九)封装统一的json返回处理工具

在本篇文章之前的接口&#xff0c;我们每个接口异常返回的数据格式都不一样&#xff0c;处理起来也没有那么方便&#xff0c;因此我们可以封装一个统一的json。 from fastapi import status from fastapi.responses import JSONResponse, Response from typing import Unionde…

SSM 整合(Spring + MyBatis;Spring + Spring MVC)

1. SSM 整合(Spring MyBatis&#xff1b;Spring Spring MVC) 文章目录 1. SSM 整合(Spring MyBatis&#xff1b;Spring Spring MVC)2. 引入相关依赖3. SSM 整合3.1 创建包结构 4. Spring 整合 MyBatis4.1 编写 jdbc.properties4.2 编写 DataSourceConfig 数据源配置4.3 编…

【LLM】基于ColossalAI-0.3.6对llama2-7B-Chat做全参数微调

文章目录 环境准备工作下载llama2-7B下载ColossalAI数据集准备准备原始数据集数据集处理开始训练准备训练脚本运行脚本推理验证加载模型推理环境 操作系统: ubuntu22.04机器规格: CPU:96c;内存:736 GiB;GPU:8 * NVIDIA V100 (32GB)软件信息: Python 3.11.5;ColossalA…

vue 实现打字机效果

打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。支持vue 插值语法和表格等打印 ps: 灵感来着于vue-type-writer 但是 这个组件过于简单 就自己整了一个 一、预览 二、代码 组件&#xff1a; <template><div :style"{ visibility: visibility }&qu…