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初始化过程。
相关文章:

Spring如何管理Mapper
目录 一、背景二、猜测三、源码查看步骤1、创建MapperScannerConfigurer.java2、MapperScan注解3、MapperScannerRegistrar执行registerBeanDefinitions方法4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法5、执行doscan6、设置beanClass7、使用jdk生成代…...

NFS存储、API资源对象StorageClass、Ceph存储-搭建ceph集群和Ceph存储-在k8s里使用ceph(2024-07-16)
一、NFS存储 注意:在做本章节示例时,需要拿单独一台机器来部署NFS,具体步骤略。NFS作为常用的网络文件系统,在多机之间共享文件的场景下用途广泛,毕竟NFS配置方 便,而且稳定可靠。NFS同样也有一些缺点&…...

「Vue组件化」封装i18n国际化
前言 在Vue应用中实现国际化(i18n),通常需要使用一些专门的库,比如vue-i18n。本文主要介绍自定义封装i18n,支持Vue、uniapp等版本。 设计思路 一、预期效果 二、核心代码 2.1 i18n.xlsx文件准备 2.2 脚本执行 根目录main.js根目录locali18n.xlsxnode main.jsmain.js 文件…...

【Git远程操作】理解分布式管理 | 创建远程仓库
目录 1.理解分布式管理 多人协作开发 2.创建远程仓库 2.1仓库名&路径 2.2初始化仓库&设置模板 1.理解分布式管理 目前我们学习的所有内容都是在本地来完成的。(add /commit /版本撤销回退/分支管理) Git是一个分布式 的版本控制系统。 分支…...
OJ-0718
示例1 input 3 1 1 1 output 0示例2 input 3 3 7 10 output 1示例3 input 4 3 7 10 16 output 3题解1:List {public static void main(String[] args) {Scanner in new Scanner(System.in);int num in.nextInt();List<Integer> list new ArrayList<…...

python抓包 -- 用wireshark抓包、解析--scapy、PyShark
一、 安装scapy模块 1、打开DOS命令行 python -m pip install scapy2、sniff()函数 功能:数据嗅探 参数: iface: 指定在哪个网络接口上抓包 count: 表示要捕获数据包的数量。默认为0(不限制数量) filter: 流量的过滤规则。使用的是 BPF 的语法 prn:…...

uni-app开发日志:unicloud使用时遇到的问题解决汇总(不断补充)
插件安装后提示与原数据库表冲突(2024.7.18) 安装uni-admin后再安装uni-cms,在uni-admin中添加好菜单,结果提示该错误 回到hbuilder中uniCloud/database中找到冲突的部分 比较一下,选中老的删除 opendb-news-articl…...
插入排序算法详解
快速排序(Quick Sort)是计算机科学与技术领域中非常经典的一种排序算法,由C. A. R. Hoare在1960年提出。它应用分治思想进行排序,通过对数据进行分区操作,并递归地对分区后的子序列进行排序,从而达到整个序…...
parallel 详细解析 Java 8 Stream API 中的 parallel 方法
详解Java Stream的并行处理(Parallel) Java 8 引入了Stream API,提供了一种便捷而高效的方式来处理集合数据。Stream API使得对数据集合的操作变得更为简洁和易读。 其中,并行流(parallelStream)是Stream …...

不同业务场景下通过mars3d实现绕点旋转效果
1.鼠标单击地图某一处就对该点进行绕点旋转效果 相关代码: 1.相关绕点旋转的初始化代码: const rotatePoint new mars3d.thing.RotatePoint({direction: false, // 方向 true逆时针,false顺时针time: 50 // 给定飞行一周所需时间(单位 秒)&…...

重塑水利未来:智慧水利解决方案的探索与实践,从物联网、大数据到人工智能,科技如何赋能水利行业,实现智慧化管理与决策
本文关键词:智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…...

IO、进程、线程03
第一题:预习 opendir 和 readdir函数 opendir 和 readdir 是两个在C语言(特别是使用POSIX标准的系统,如Linux和UNIX)中用于目录遍历的函数。这两个函数属于标准的C库中的目录操作部分,通常与<dirent.h>头文件一…...

算法力扣刷题记录 五十二【617.合并二叉树】
前言 二叉树篇,继续。 记录 五十二【617.合并二叉树】 一、题目阅读 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要…...
Java中的ArrayList和LinkedList有什么区别?
Java中的ArrayList和LinkedList是两种常用的集合实现类,它们都属于Java集合框架的一部分,但它们在内部实现、性能特点、使用场景等方面存在明显的区别。以下是对这两种集合的详细比较: 1. 数据结构差异 ArrayList:ArrayList是动…...
Linux C++ 058-设计模式之解释器模式
Linux C 058-设计模式之解释器模式 本节关键字:Linux、C、设计模式、解释器模式 相关库函数: 概念 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。 解释器模式用于构建一…...

MDK5没有DeviceName
遇到的问题是Jlink驱动问题 不是引脚接反 使用国产GD单片机不同的工程,有的有Device Name,有的没有Device Name(下图是弄好的情况,有Device Name) 硬件链接,和设备都没有问题:无法仿真,无法下…...

在LabVIEW中实现图像矫正
在LabVIEW中实现图像矫正,特别是将倾斜的笔记本图像(如左图)校正为正视图像(如右图),通常需要以下几个步骤: 1. 获取图像 使用图像采集设备或加载图像文件来获取图像数据。 2. 图像预处理 对…...
Apache httpd-vhosts.conf 配置详解(附Demo)
目录 前言1. 基本配置2. http和https3. 重定向和代理配置4. 实战前言 Nginx的相关配置推荐阅读:Nginx将https重定向为http进行访问的配置(附Demo) 1. 基本配置 httpd-vhosts.conf 是 Apache HTTP Server 配置虚拟主机(Virtual Hosts)的文件 虚拟主机允许在一台服务器上…...

活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施
7 月 13 日,AutoMQ 携手 GreptimeDB“新能源汽车数据基础设施” 主题 meetup 在上海圆满落幕。本次论坛多角度探讨如何通过创新的数据管理和存储架构,提升汽车系统的性能、安全性和可靠性,从而驱动行业的持续发展和创新,涵盖 Auto…...

格式工厂转换视频分辨率
1、下载和安装 http://www.pcfreetime.com/formatfactory/CN/index.html 2、打开视频 3、设置分辨率等参数 也可以选择保持原分辨率 4、执行导出 5、打开输出所在位置...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...