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、打开输出所在位置...
ReAct 大模型提示框架
你可能不熟悉 ReAct,这是一个旨在增强语言模型 (LLM) 决策能力的尖端框架。 通过使用新的观察结果更新 LLM 的上下文窗口并提示其重新评估信息,ReAct 促进了类似于人类思维过程的推理水平,超越了诸如思维链提示之类的旧技术。 在本文中&…...
JavaEE:Lombok工具包的使用以及EditStarter插件的安装
Lombok是一个Java工具库,通过添加注解的方式,简化Java的开发。 目录 1、引入依赖 2、使用 3、原理解释 4、更多使用 5、更快捷的引入依赖 1、引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lomb…...
基于纹理和统计图像特征集成的计算机辅助乳腺癌检测
诊断通常使用组织病理学切片,可以确定组织是否处于导管原位癌(DCIS)阶段,其中癌细胞尚未扩散到周围乳腺组织,或浸润性导管癌(IDC)阶段,其中细胞已渗透到邻近组织。对于医生来说,检测IDC非常耗时且具有挑战性。因此&…...
Java基础 - 简介和配置环境变量
目录 一. 简介 二. 开发环境配置 下载JDK 配置环境变量 Java_Home配置, Path 配置 CLASSPATH 配置 三. 编辑器选择 1.JetBrains 2. Eclipse 3.vscode 下载vscode 安装 vscode插件 四. 总结 一. 简介 Java 是由 Sun Microsystems 公司(后被 Oracle 收…...
水域救援装备的详细简介_鼎跃安全
水域救援行动需要救援人员配备全面、专业的装备,以应对各种复杂的水域环境和救援任务。水域救援套装应运而生,它集合了水域救援所需的各类关键装备,为救援人员提供全方位的保护和辅助,确保数援行动的高效与安全。 水域救援头盔&am…...
二、BIO、NIO、直接内存与零拷贝
一、网络通信编程基础 1、Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口,由操作系统提供; Socket将复杂的TCP/IP协议处理和通信缓存管理都隐藏在接口后面,对用户来说就是使用简单的接口进行网络应用编程…...
生成式AI的发展方向:Chat vs Agent
一、整体介绍 生成式AI作为人工智能领域的重要分支,近年来取得了显著进展,并在多个领域展现出巨大潜力。其核心在于通过机器学习和深度学习算法,从大量数据中学习规律和特征,进而生成具有创新性和多样性的文本、图像、音频和视频…...
吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.9-2.10
目录 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)第二周:机器学习策略(2)(ML Strategy (2))2.9 什么是端到端的深度学习?(What is end-to-end deep learning?&#x…...
变频空调介绍
直流变频空调:只有压缩机是直流变频的,而室外机风电机和室内机风电机都是定频的。 全直流变频空调:它的压缩机是直流变频的,并且室外机风机和室内机风机都是直流变频的。因为大三部件一个不漏,所以就叫做全直流变频。…...
C语言实现二叉树以及二叉树的详细介绍
目录 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 3.二叉树顺序结构--特殊的二叉树--堆及其实现 3.1堆的概念及结构 3.2堆的实现 3.2.1堆的结构 3.2.2堆…...
石家庄网站建设成功案例/如何去除痘痘效果好
环境说明 系统版本:CentOS 7.6软件版本:Nginx 1.15.9 我们在Nginx社区网站找到下载页面,选择目前最新的Nginx稳定版1.15.9进行下载,然后通过源码的方式进行编译及安装。 安装配置 编译前环境所需的命令及依赖库安装yum -y install…...
商城移动端网站开发/东莞网站推广大全
引子 今年开始,我在翻译一本大部头的,比较经典的的Python进阶书籍。 有空就翻译几页。这本书不仅是教你很多进阶的Python的语法,更重要的是讲解很多设计方法和设计思想。 这些方法和思想,一点点叠加起来,就会让你从…...
简洁大气的企业网站/seo优化与品牌官网定制
2019独角兽企业重金招聘Python工程师标准>>> 今天看element-react源码的时候,又看到了这张似曾相识却又异常陌生的老面孔,那就是Function.prototype.apply()... import React from react; import PropTypes from prop-types; import classnam…...
国外网站设计网站/网站推广平台搭建
最近着迷上了 Python用Python给小宝做的数学算数口算练习程序(2015年1月添加四则运算)!给小宝做的口算游戏:#用Python给小宝做的数学算数口算练习程序(2015年1月添加四则运算)!#给小宝做的口算游戏:import stringimport randominput11nums10num0righ1t0 …...
厚街商城网站建设/上海营销seo
一、主流浏览器及其内核: 主流浏览器内核IEtridentFirefoxGeckoGoogle ChromeWebkit/blinkSafari(苹果自带)Webkit(谷歌工程师和苹果工程师一起研发的)Opera(丹麦)presto 二、主流浏览器的要求…...
找个男做那个视频网站好/济南百度推广公司电话
首先是 注册码问题 推荐使用 zoho 邮箱,这个是免费的企业邮箱,重要的是不用填那些乱七八糟的东西,注册很方便 其二是 安装问题 安装时不要选中 安装后启动和初始化 类似的英文 ,后面可能会卡住,看终端你可以发现写着…...