当前位置: 首页 > news >正文

Mybatis源码解析

MybatisAutoConfiguration或者MybatisPlusAutoConfiguration核心作用是初始化工厂类SqlSessionFactory,其中包含属性interceptors、MapperLocations、TypeAliasesPackage、TypeEnumsPackage、TypeHandlers等。

MybatisAutoConfiguration自动装配类是由依赖:mybatis-spring-boot-starter【mybatis-spring-boot-autoconfigure】提供的,如果使用Mp版本则直接由MybatisPlusAutoConfiguration替代MybatisAutoConfiguration。


@Mapper通过@Import注解导入ImportBeanDefinitionRegistrar类型的实现类MapperScannerRegistrar,类ImportBeanDefinitionRegistrar的作用:

  1. 核心是引入类MapperScannerConfigurer,初始化其对应的BeanDefinition,并注册至IOC中BeanDefinition类型的注册表中。
  2. MapperScannerConfigurer实为BeanDefinitionRegistryPostProcessor类型的后置处理器。
  3. 注解@MapperScan相关属性value重置到MapperScannerConfigurer对应的BeanDefinition内部。
  4. 将MapperScannerConfigurer对应的BeanDefinition注册至Spring IOC容器内部。

BeanDefinitionRegistryPostProcessor类型的后置处理器MapperScannerConfigurer:此时@Mapper注解相关属性重置于MapperScannerConfigurer

  1. 扫描basePackages路径下全部的Mapper接口。
  2. 遍历每一个接口为其生成BeanDefinition,其内部beanClass属性value为MapperFactoryBean
  3. 将@Mapper组合注解相关属性转化为MapperFactoryBean相关字段或者方法属性。

@Mapper -> MapperScannerRegistrar -> MapperScannerConfigurer-> MapperFactoryBean转化流程:

public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar{public void registerBeanDefinitions(AnnotationAttributes annoAttrs,BeanDefinitionRegistry registry, String beanName) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);...// 将 @MapperScan 属性sqlSessionTemplateRef 作为 MapperScannerConfigurer的属性sqlSessionTemplateRefString sqlSessionTemplateRef = annoAttrs.getString("sqlSessionTemplateRef");if (StringUtils.hasText(sqlSessionTemplateRef)) {builder.addPropertyValue("sqlSessionTemplateBeanName",annoAttrs.getString("sqlSessionTemplateRef"));}// 将 @MapperScan 属性sqlSessionFactoryRef 作为 MapperScannerConfigurer的属性sqlSessionFactoryBeanNameString sqlSessionFactoryRef = annoAttrs.getString("sqlSessionFactoryRef");if (StringUtils.hasText(sqlSessionFactoryRef)) {builder.addPropertyValue("sqlSessionFactoryBeanName",annoAttrs.getString("sqlSessionFactoryRef"));}...registry.registerBeanDefinition(beanName, builder.getBeanDefinition());}
}

以上将注解@MapperScan 属性转移到MapperScannerConfigurer。

public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor, InitializingBean{private boolean addToConfig = true;private SqlSessionFactory sqlSessionFactory;private SqlSessionTemplate sqlSessionTemplate;private String sqlSessionFactoryBeanName;private String sqlSessionTemplateBeanName;public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);//以下将 @MapperScan 相关属性转移到 ClassPathMapperScannerscanner.setAddToConfig(this.addToConfig);scanner.setAnnotationClass(this.annotationClass);scanner.setMarkerInterface(this.markerInterface);scanner.setSqlSessionFactory(this.sqlSessionFactory);scanner.setSqlSessionTemplate(this.sqlSessionTemplate);scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);scanner.setResourceLoader(this.applicationContext);scanner.setBeanNameGenerator(this.nameGenerator);scanner.setMapperFactoryBeanClass(this.mapperFactoryBeanClass);scanner.registerFilters();scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage,",; \t\n"));}
}

 将 MapperScannerConfigurer 相关属性转移到类ClassPathMapperScanner。

public class ClassPathMapperScanner extends ClassPathBeanDefinitionScanner {private Class<? extends MapperFactoryBean> mapperFactoryBeanClass = MapperFactoryBean.class;private void processBeanDefinitions(Set<BeanDefinitionHolder> beanDefinitions) {GenericBeanDefinition definition;for (BeanDefinitionHolder holder : beanDefinitions) {//basePackages路径下扫描得到全部Mapper接口...// 将 Mapper接口之 GenericBeanDefinition 的BeanClass属性为 MapperFactoryBeandefinition.setBeanClass(this.mapperFactoryBeanClass);// 给 MapperFactoryBean 添加属性字段 addToConfigdefinition.getPropertyValues().add("addToConfig", this.addToConfig);boolean explicitFactoryUsed = false;// 给 MapperFactoryBean 添加属性字段 sqlSessionFactoryif (StringUtils.hasText(this.sqlSessionFactoryBeanName)) {definition.getPropertyValues().add("sqlSessionFactory",new RuntimeBeanReference(this.sqlSessionFactoryBeanName));explicitFactoryUsed = true;} else if (this.sqlSessionFactory != null) {definition.getPropertyValues().add("sqlSessionFactory", this.sqlSessionFactory);explicitFactoryUsed = true;}// 给 MapperFactoryBean 添加属性字段 sqlSessionTemplateif (StringUtils.hasText(this.sqlSessionTemplateBeanName)) {definition.getPropertyValues().add("sqlSessionTemplate",new RuntimeBeanReference(this.sqlSessionTemplateBeanName));explicitFactoryUsed = true;} else if (this.sqlSessionTemplate != null) {definition.getPropertyValues().add("sqlSessionTemplate", this.sqlSessionTemplate);explicitFactoryUsed = true;}definition.setLazyInit(lazyInitialization);}}
}

相关文章:

Mybatis源码解析

MybatisAutoConfiguration或者MybatisPlusAutoConfiguration核心作用是初始化工厂类SqlSessionFactory&#xff0c;其中包含属性interceptors、MapperLocations、TypeAliasesPackage、TypeEnumsPackage、TypeHandlers等。 MybatisAutoConfiguration自动装配类是由依赖&#xf…...

前端学习CSS之神奇的块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…...

【Java】内部类、枚举、泛型

目录 1.内部类1.1概述1.2分类1.3匿名内部类(重点) 2.枚举2.1一般枚举2.2抽象枚举2.3应用1&#xff1a;用枚举写单例2.4应用2&#xff1a;标识常量 3.泛型3.1泛型认识3.2泛型原理3.3泛型的定义泛型类泛型接口泛型方法 3.4泛型的注意事项 1.内部类 1.1概述 内部类&#xff1a;指…...

LabVIEW电子类实验虚拟仿真系统

开发了基于LabVIEW开发的电子类实验虚拟仿真实验系统。该系统通过图形化编程方式&#xff0c;实现了复杂电子实验操作的虚拟化&#xff0c;不仅提高了学生的操作熟练度和学习兴趣&#xff0c;而且通过智能评价模块提供即时反馈&#xff0c;促进教学和学习的互动。 项目背景 在…...

SVM支持向量机

SVM的由来和概念 间隔最大化是找最近的那个点的距离’ 之前我们学习的都是线性超平面,现在我们要将超平面变成圈 对于非线性问题升维来解决 对于下图很难处理,我们可以将棍子立起来,然后说不定red跑到左边了,green跑到右边了(可能增加了某种筛选条件导致两个豆子分离)(只是一种…...

【Unity】RPG2D龙城纷争(二)关卡、地块

更新日期&#xff1a;2024年6月12日。 项目源码&#xff1a;后续章节发布 索引 简介地块&#xff08;Block&#xff09;一、定义地块类二、地块类型三、地块渲染四、地块索引 关卡&#xff08;Level&#xff09;一、定义关卡类二、关卡基础属性三、地块集合四、关卡初始化五、关…...

mediamtx流媒体服务器测试

MediaMTX简介 在web页面中直接播放rtsp视频流&#xff0c;重点推荐&#xff1a;mediamtx&#xff0c;不仅仅是rtsp-CSDN博客 mediamtx github MediaMTX(以前的rtsp-simple-server)是一个现成的和零依赖的实时媒体服务器和媒体代理&#xff0c;允许发布&#xff0c;读取&…...

C# 循环

C# 循环 在编程中&#xff0c;循环是一种控制结构&#xff0c;它允许我们重复执行一段代码多次。C# 提供了几种循环机制&#xff0c;以适应不同的编程需求。本文将详细介绍 C# 中常用的几种循环类型&#xff0c;包括 for 循环、while 循环、do-while 循环和 foreach 循环&…...

PHP杂货铺家庭在线记账理财管理系统源码

家庭在线记帐理财系统&#xff0c;让你对自己的开支了如指掌&#xff0c;图形化界面操作更简单&#xff0c;非常适合家庭理财、记账&#xff0c;系统界面简洁优美&#xff0c;操作直观简单&#xff0c;非常容易上手。 安装说明&#xff1a; 1、上传到网站根目录 2、用phpMyad…...

机器学习中的神经网络重难点!纯干货(上篇)

. . . . . . . . .纯干货 . . . . . . 目录 前馈神经网络 基本原理 公式解释 一个示例 卷积神经网络 基本原理 公式解释 一个示例 循环神经网络 基本原理 公式解释 一个案例 长短时记忆网络 基本原理 公式解释 一个示例 自注意力模型 基本原理…...

[DDR4] DDR1 ~ DDR4 发展史导论

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 内存和硬盘是电脑的左膀右臂&#xff0c; 挑起存储的大梁。因为内存的存取速度超凡地快&#xff0c; 但内存上的数据掉电又会丢失&#xff0c;一直其中缓存的作用&#xff0c;就像是我们的工…...

享元和代理模式

文章目录 享元模式1.引出享元模式1.展示网站项目需求2.传统方案解决3.问题分析 2.享元模式1.基本介绍2.原理类图3.外部状态和内部状态4.类图5.代码实现1.AbsWebSite.java 抽象的网站2.ConcreteWebSite.java 具体的网站&#xff0c;type属性是内部状态3.WebSiteFactory.java 网站…...

[英语单词] ellipsize,动词化后缀 -ize

openvswitch manual里的一句话&#xff1a;里面有使用ellipsize&#xff0c;但是查字典是没有这个单词&#xff0c;这就是创造出来的动词。将单词ellipsis&#xff0c;加动词化后缀&#xff0c;-ize。 Often we ellipsize arguments not important to the discussion, e.g.: &…...

自然资源-测绘地信专业术语,值得收藏!

自然资源-测绘地信专业术语&#xff0c;值得收藏&#xff01; 1、1954年北京坐标系 1954年我国决定采用的国家大地坐标系&#xff0c;实质上是由原苏联普尔科沃为原点的1942年坐标系的延伸。 2、1956年黄海高程系统 根据青岛验潮站1950年一1956年的验潮资料计算确定的平均海面…...

如何在小程序中实现页面之间的返回

在小程序中实现页面之间的返回&#xff0c;通常有以下几种方法&#xff0c;这些方法各有特点&#xff0c;适用于不同的场景&#xff1a; 1. 使用wx.navigateBack方法 描述&#xff1a;wx.navigateBack是微信小程序中用于关闭当前页面&#xff0c;返回上一页面或多级页面的API…...

深入解析数据结构之B树:平衡树中的王者

在计算机科学中&#xff0c;数据结构是算法和程序设计的基础。而在众多数据结构中&#xff0c;B树作为一种平衡树&#xff0c;在数据库和文件系统中有着广泛应用。本文将详细介绍B树的概念、特点、操作、优缺点及其应用场景&#xff0c;帮助读者深入理解这一重要的数据结构。 …...

18. 第十八章 继承

18. 继承 和面向对象编程最常相关的语言特性就是继承(inheritance). 继承值得是根据一个现有的类型, 定义一个修改版本的新类的能力. 本章中我会使用几个类来表达扑克牌, 牌组以及扑克牌性, 用于展示继承特性.如果你不玩扑克, 可以在http://wikipedia.org/wiki/Poker里阅读相关…...

OperationalError: (_mysql_exceptions.OperationalError)

OperationalError: (_mysql_exceptions.OperationalError) (2006, MySQL server has gone away) 这个错误通常表示客户端(例如你的 Python 程序使用 SQLAlchemy 连接到 MySQL 数据库)和 MySQL 服务器之间的连接被异常关闭了。这个问题可能由多种原因引起,以下是一些常见的原…...

DocGraph相关概念

结合简化版的直观性和专业版的深度&#xff0c;我们可以得到一个既易于理解又包含专业细节的DocGraph概念讲解。 DocGraph概述&#xff08;简化版&#xff09; 想象DocGraph就像是文章信息的地图。它通过拆分文档、识别关键词、分析关系&#xff0c;并最终以图形方式呈现这些…...

MySQL限制登陆失败次数配置

目录 一、限制登陆策略 1、Windows 2、Linux 一、限制登陆策略 1、Windows 1&#xff09;安装插件 登录MySQL数据库 mysql -u root -p 执行命令安装插件 #限制登陆失败次数插件 install plugin CONNECTION_CONTROL soname connection_control.dll;install plugin CO…...

PIM架构如何优化LLM推理中的内存墙问题

1. PIM架构核心原理与LLM推理瓶颈在传统冯诺依曼架构中&#xff0c;数据需要在处理器和内存之间频繁搬运&#xff0c;这种"内存墙"问题在大型语言模型(LLM)推理场景中尤为突出。处理内存计算(PIM)技术的革命性在于将计算单元直接嵌入内存控制器附近&#xff0c;通过近…...

基于ChatGPT与Next.js的React组件自然语言生成器开发实战

1. 项目概述&#xff1a;一个由ChatGPT驱动的React组件实时生成器 作为一名在React生态里摸爬滚打了多年的前端开发者&#xff0c;我深知从零开始构建一个UI组件&#xff0c;尤其是那些需要反复调整样式和交互逻辑的组件&#xff0c;是多么耗时耗力。我们常常在Figma里画好了设…...

阴阳师自动化脚本终极指南:如何用OnmyojiAutoScript一键托管你的日常游戏

阴阳师自动化脚本终极指南&#xff1a;如何用OnmyojiAutoScript一键托管你的日常游戏 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 还在为阴阳师繁琐的日常任务而烦恼吗&#…...

自动化生产管理平台(Automatic)

1&#xff0c;自动化生产管理平台(Automatic) 1.1&#xff0c;重新定义Window样式 添加WindowChrome元素进行自定义定义 <Window x:Class"lzg.Automatic.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"…...

高性能事件存储引擎Chronicle:原理、部署与生产实践指南

1. 项目概述与核心价值最近在折腾日志和事件数据的管理&#xff0c;发现一个挺有意思的开源项目&#xff0c;叫tensakulabs/chronicle。这名字起得挺贴切&#xff0c;“编年史”&#xff0c;一听就知道是跟记录、存储历史事件相关的。简单来说&#xff0c;Chronicle 是一个高性…...

从AI概念到落地:传统AI与生成式AI的技术分野与实战选型

1. 从“谈AI色变”到“用AI解题”&#xff1a;我们到底在讨论什么&#xff1f;如果你最近两年没在火星上度假&#xff0c;那你肯定被“AI”这个词全方位轰炸过。从科技媒体的头条&#xff0c;到投资机构的报告&#xff0c;再到你手机里突然冒出的各种“智能”功能&#xff0c;A…...

旭雷禹鼎遥控器F21-E2B-8起重机天车行车电动葫芦工业无线遥控器

旭雷禹鼎遥控器F21-E2B-8起重机天车行车电动葫芦工业无线遥控器起重机工业无线遥控器的兼容性极强&#xff0c;可适配各类型号、不同吨位的起重机&#xff0c;无需大规模改造设备&#xff0c;大幅降低企业升级成本。无论是桥式起重机、门式起重机&#xff0c;还是塔式起重机、悬…...

Standard计划突然限速?揭秘MJ v6.1后台配额算法变更,3步绕过队列延迟,今日生效

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Standard计划限速事件的全貌还原 2024年Q2&#xff0c;Standard计划在多个云原生生产环境中突发性触发API速率限制&#xff08;Rate Limiting&#xff09;&#xff0c;导致下游服务批量超时与重试风暴。…...

应用安全从被动到主动:企业如何提升弹性与可靠性,降低安全债务?

ZDNET核心观点应用安全需董事会层面问责&#xff0c;企业文化影响“设计即安全”工作&#xff0c;运营模式将预防转化为行动。企业聚焦软件策略改变网络安全结果&#xff0c;挑战是在开发周期早期融入安全措施&#xff0c;构建捕捉漏洞和隐患的工具技术。本文将从被动到主动的转…...

从零构建开发者效率工具:CLI脚手架与自动化工作流实践

1. 项目概述与核心价值最近在开源社区里&#xff0c;一个名为smouj/smouj的项目引起了我的注意。乍一看这个标题&#xff0c;可能会让人有些摸不着头脑&#xff0c;它不像常见的vue/vue或tensorflow/tensorflow那样直白地揭示了其技术栈。但恰恰是这种看似“神秘”的命名&#…...