MyBatis 配置文件解析使用了哪些设计模式

news2025/3/20 16:41:46

MyBatis 配置文件解析过程中,主要运用了以下几种设计模式

1. 建造者模式 (Builder Pattern):

  • 应用场景: SqlSessionFactoryBuilderXMLConfigBuilder 类都体现了建造者模式。
  • 模式描述: 建造者模式将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它允许用户一步一步地构造复杂对象,而无需知道内部构建细节。
  • MyBatis 中的应用:
    • SqlSessionFactoryBuilder: 作为 SqlSessionFactory 的建造者,它抽象了 SqlSessionFactory 的创建过程。开发者通过 SqlSessionFactoryBuilder.build() 方法,传入不同的配置源 (如 InputStream, Configuration 对象),就可以构建出 SqlSessionFactory 实例,而无需了解 SqlSessionFactory 内部的复杂初始化过程。
    • XMLConfigBuilder: 作为 Configuration 对象的建造者,它负责解析 XML 配置文件 (mybatis-config.xml),并逐步构建 Configuration 对象。 XMLConfigBuilder.parse() 方法封装了对 XML 配置文件的解析、验证、以及将配置信息填充到 Configuration 对象中的复杂流程。

2. 工厂模式 (Factory Pattern):

  • 应用场景: SqlSessionFactoryBuilder 本身也可以被视为 SqlSessionFactory 的工厂。 MapperProxyFactory 是 Mapper 代理对象的工厂。
  • 模式描述: 工厂模式提供了一种创建对象的最佳方式,将对象的创建逻辑封装在一个工厂类中,客户端代码只需要通过工厂类来获取对象,而无需关心对象的具体创建过程。
  • MyBatis 中的应用:
    • SqlSessionFactoryBuilder: 可以看作是 SqlSessionFactory 的抽象工厂。 SqlSessionFactoryBuilder 提供了 build() 方法,用于创建 SqlSessionFactory 实例,隐藏了 SqlSessionFactory 的具体实现类 (DefaultSqlSessionFactory) 和创建细节。
    • MapperProxyFactory: 作为 Mapper 接口代理对象的工厂,MapperProxyFactory 负责创建 Mapper 接口的动态代理对象 (使用 JDK 动态代理或 CGLIB)。 MapperProxyFactory.newInstance() 方法隐藏了代理对象的创建细节,客户端代码只需要通过 MapperRegistry.getMapper() 方法就可以获取 Mapper 代理对象。

3. 模板方法模式 (Template Method Pattern):

  • 应用场景:XMLConfigBuilderXMLMapperBuilder 的 XML 解析过程中,存在一些通用的解析流程,但具体的解析步骤可能因 XML 元素类型而异。 模板方法模式被用于定义通用的解析框架,并将具体的解析步骤延迟到子类实现。
  • 模式描述: 模板方法模式在一个抽象类中定义一个算法的骨架,并将某些步骤延迟到子类中实现。 这样,子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
  • MyBatis 中的应用 (推测,更偏内部实现):
    • XML 解析流程: XMLConfigBuilderXMLMapperBuilderparse() 方法可能使用了模板方法模式。 parse() 方法定义了 XML 解析的通用流程 (例如:加载 XML -> 解析根元素 -> 顺序解析子元素 -> 构建对象),而具体的子元素解析逻辑 (例如解析 <properties>, <settings>, <mappers>, <select>, <resultMap> 等) 则可能由不同的子类或策略类来实现。 (需要更深入源码才能确认,但模板方法模式很适合这种场景)。

4. 策略模式 (Strategy Pattern):

  • 应用场景: MyBatis 配置文件中,某些配置项可能存在多种策略或实现方式,例如缓存实现类型 (<cache type="...">),事务管理器类型 (<transactionManager type="...">),数据源类型 (<dataSource type="...">) 等。 策略模式被用于允许在运行时动态地选择和切换不同的策略实现。
  • 模式描述: 策略模式定义了一系列算法,并将每个算法封装到独立的策略类中,使得算法可以独立于使用它的客户端代码而变化。
  • MyBatis 中的应用:
    • 缓存策略 (<cache type="...">): MyBatis 允许配置不同的缓存实现类型 (例如 PERPETUAL, LRU, FIFO, WEAK, SOFT, 或自定义缓存实现)。 每种缓存类型都对应一个 Cache 接口的实现类 (策略类)。 在解析 <cache> 元素时,XMLConfigBuilder 会根据 type 属性的值,动态地选择并创建对应的 Cache 实现类实例。
    • 事务管理器类型 (<transactionManager type="...">): MyBatis 支持不同的事务管理器类型 (例如 JDBC, MANAGED, 或自定义事务管理器)。 每种事务管理器类型都对应一个 TransactionFactory 接口的实现类 (策略类)。 在解析 <transactionManager> 元素时,XMLConfigBuilder 会根据 type 属性的值,动态地选择并创建对应的 TransactionFactory 实现类实例。
    • 数据源类型 (<dataSource type="...">): MyBatis 支持不同的数据源类型 (例如 UNPOOLED, POOLED, JNDI, 或自定义数据源实现)。 每种数据源类型都对应一个 DataSourceFactory 接口的实现类 (策略类)。 在解析 <dataSource> 元素时,XMLConfigBuilder 会根据 type 属性的值,动态地选择并创建对应的 DataSourceFactory 实现类实例。

5. 注册器模式 (Registry Pattern) (可以归类到工厂模式的变种):

  • 应用场景: TypeHandlerRegistryMapperRegistry 本身可以看作是注册器模式的应用。 它们负责注册和管理特定类型的组件 (TypeHandler 和 Mapper 接口)。
  • 模式描述: 注册器模式用于创建一个集中管理特定类型对象的注册中心,并提供根据键值获取已注册对象的能力。
  • MyBatis 中的应用:
    • TypeHandlerRegistry: 作为 TypeHandler 的注册中心,负责注册和管理所有 TypeHandler,并提供 getTypeHandler() 方法根据 Java 类型和 JDBC 类型查找 TypeHandler。
    • MapperRegistry: 作为 Mapper 接口的注册中心,负责注册和管理所有 Mapper 接口,并提供 getMapper() 方法根据 Mapper 接口类型获取 Mapper 代理对象.

总结:

MyBatis 配置文件解析过程巧妙地运用了多种设计模式,主要包括:

  • 建造者模式 (Builder Pattern): 用于构建复杂的 SqlSessionFactoryConfiguration 对象。
  • 工厂模式 (Factory Pattern): 用于创建 SqlSessionFactory 和 Mapper 代理对象。
  • 模板方法模式 (Template Method Pattern): 可能用于定义 XML 解析的通用流程 (更偏内部实现)。
  • 策略模式 (Strategy Pattern): 用于支持多种可切换的配置策略 (缓存策略、事务管理器类型、数据源类型等)。
  • 注册器模式 (Registry Pattern): 用于管理特定类型的组件 (TypeHandler 和 Mapper 接口)。

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

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

相关文章

Git的基本指令

一、回滚 1.git init 在项目文件夹中打开bash生成一个.git的子目录&#xff0c;产生一个仓库 2.git status 查看当前目录下的所有文件的状态 3.git add . 将该目录下的所有文件提交到暂存区 4.git add 文件名 将该目录下的指定文件提交到暂存区 5.git commit -m 备注信…

Vitis 2024.1 无法正常编译custom ip的bug(因为Makefile里的wildcard)

现象&#xff1a;如果在vivado中&#xff0c;添加了自己的custom IP&#xff0c;比如AXI4 IP&#xff0c;那么在Vitis&#xff08;2024.1&#xff09;编译导出的原本的.xsa的时候&#xff0c;会构建build失败。报错代码是&#xff1a; "Compiling blank_test_ip..."…

Elasticsearch 在航空行业:数据管理的游戏规则改变者

作者&#xff1a;来自 Elastic Adam La Roche 数字化客户体验不再是奢侈品&#xff0c;而是欧洲航空公司必不可少的需求。它推动了客户满意度&#xff0c;提升了运营效率&#xff0c;并创造了可持续的竞争优势。随着行业的不断发展&#xff0c;优先投资前沿数字技术和平台的航空…

DeepSeek 模型的成本效益深度解析:低成本、高性能的AI新选择

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

利用knn算法实现手写数字分类

利用knn算法实现手写数字分类 1.作者介绍2.KNN算法2.1KNN&#xff08;K-Nearest Neighbors&#xff09;算法核心思想2.2KNN算法的工作流程2.3优缺点2.4 KNN算法图示介绍 3.实验过程3.1安装所需库3.2 MNIST数据集3.3 导入手写数字图像进行分类3.4 完整代码3.5 实验结果 1.作者介…

基于springboot+vue的调查问卷平台

一、系统架构 前端&#xff1a;vue | element-ui | echarts 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. web端-问卷中心 04. web端-文章中心 05. 管理端-…

美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!

今年以来&#xff0c;DeepSeek凭借其强大的深度推理分析能力&#xff0c;在AI领域掀起新的热潮。美摄科技快速响应市场需求&#xff0c;迅速接入以DeepSeek、通义千问、商汤、文心一言为代表的大模型&#xff0c;为企业视频创作生产带来全新体验。 传统视频创作面临着同质化、…

网络编程之客户端聊天(服务器加客户端共三种方式)

最终效果&#xff1a; serve.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/select.h>#define MAX_CLIENTS 2 // 只允许两个客户端 #define BUF_SIZE 1024i…

图莫斯TOOMOSS上位机TCANLINPro使用CAN UDS功能时 编写、加载27服务dll解锁算法文件

【本文发布于https://blog.csdn.net/Stack_/article/details/146303690&#xff0c;未经许可不得转载&#xff0c;转载须注明出处】 软件安装目录下找到如下压缩包&#xff0c;此为dll文件示例工程 使用VisualStudio打开工程GenerateKeyExImpl.vcxproj&#xff0c;可能会提示版…

vue+echarts实现饼图组件(实现左右联动并且数据量大时可滚动)

pieChart.vue(直接cv即可) <template><div class"rBox1"><div id"rBox1"></div></div> </template><script> export default {name: "pieChart",dicts: [],props: {subtext: {type: String,default…

Linux vim mode | raw / cooked

注&#xff1a;机翻&#xff0c;未校。 vim terminal “raw” mode Vim 终端 “raw” 模式 1. 原始模式与已处理模式的区别 We know vim puts the terminal in “raw” mode where it receives keystrokes as they are typed, opposed to “cooked” mode where the command…

IMX8MP Android 10系统编译SDK

概述&#xff1a; 本文描述了在Ubuntu 20.04操作系统上搭建IMX8MP Android10系统编译环境。 ubuntu主机端设置 1. ubuntu 20.04 1. 450G Free Disk space 2. 16GB RAM以上 3. 安装 sudo apt-get install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop …

ICLR 2025 机器人智能灵巧操作更进一步DexTrack

现实世界的机器人距离科幻小说里的机器人世界还有多远&#xff1f;通用灵巧操控何时才能实现&#xff1f;朝着这一伟大的目标&#xff0c;研究通用灵巧操控轨迹跟踪的 DexTrack 便应运而生。 论文地址&#xff1a;https://arxiv.org/abs/2502.09614代码地址&#xff1a;https:/…

Golang开发

Golang 文章目录 Golang预备技术一、算法与数据结构第1章&#xff1a;基础算法第2章&#xff1a;数据结构第3章&#xff1a;搜索与图论第4章&#xff1a;数论第5章&#xff1a;动态规划第6章&#xff1a;贪心第7章&#xff1a;算法竞赛入门 二、Linux操作系统与Shell编程三、计…

AI入门7:python三种API方式调用本地Ollama+DeepSeek

回顾 书接上篇&#xff1a;各种方式搭建了本地知识库&#xff1a; AI入门&#xff1a;AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2&#xff1a;本地AI部署&#xff0c;用ollama部署deepseek&#xff08;私有化部署&#xff09;-CSDN博客 AI入门3&#xff1a;给本地d…

《线程池:Linux平台编译线程池动态库发生的死锁问题》

关于如何编译动态库可以移步《Linux&#xff1a;动态库动态链接与静态库静态链接》-CSDN博客 我们写的线程池代码是闭源的&#xff0c;未来想提供给别人使用&#xff0c;只需要提供so库和头文件即可。 系统默认库文件路径为&#xff1a; usr/lib usr/loacl/lib 系统默认头文件…

Python Bug修复案例分析:Python 中常见的 IndentationError 错误 bug 的修复

在 Python 编程的世界里&#xff0c;代码的可读性和规范性至关重要。Python 通过强制使用缩进来表示代码块的层次结构&#xff0c;这一独特的设计理念使得代码更加清晰易读。然而&#xff0c;正是这种对缩进的严格要求&#xff0c;导致开发者在编写代码时&#xff0c;稍有不慎就…

OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 基于仿射变换的估计器。 这种估计器使用匹配器估算的成对变换来为每个相机估算最终的变换。 cv::detail::AffineBasedEstimator 是 OpenCV 库中…

c++类和对象(下篇)下

下面就来补充一下c雷和对象最后一点内容. 首先先补充一下上一篇博客上c类和对象(下篇)上-CSDN博客最后学习的静态成员变量的小练习求123...n_牛客题霸_牛客网 (nowcoder.com)下面就是题解.灵活的运用了静态成员变量不销毁的特点,建立数组利用构造函数来完成n次相加. class A{ …

使用WebDAV将文件传输到实时(RT)目标 转发

如何配置Web分布式创作和版本控制&#xff08;WebDAV&#xff09;服务器并使用它来与我的实时(RT)目标之间传输文件&#xff1f; 在目标上安装 WebDAV 和 SSL 支持 NI Linux Real-Time 您无需完成任何安装 WebDAV 和 SSL 支持的步骤。默认情况下&#xff0c;这些组件在NI Linu…