Mybatis源码分析_事务管理器 (5)

news2024/10/5 10:24:15

今天我们首先学习2个设计模式。工厂设计模式 和 模板设计模式

工厂方法模式: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类实例化延迟到子类。

上图的图很清晰:业务接口有很多实现类,而工厂接口也有还多实现类。每一个工厂的实现类对应一个业务实现类,来控制他们的实例化过程。 如果业务类新增一个实现类,那么我们只要新增一个工厂实现类即可。而每一个业务实现类只负责自身的功能,对于新增的功能不会影响原有的功能,也不需要修改原有的代码,符合单一职责与开闭原则。还不明白的可以看我的另一篇博客《大话设计模式》——读后感 (5)雷锋依然在人间?——工厂方法模式_chen_yao_kerr的博客-CSDN博客

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤。

其实,只要有类的继承,就会有模板设计模式。

简单点,就是抽象类中写一些公共逻辑,然后子类继承抽象类并重写方法,定义一些子类特有的逻辑,当我们使用这个子类的时候,公共逻辑调用父类的即可,这就是模板设计模式。 

复杂点,抽象类中某个方法,比如A,在A方法中定义了一些逻辑,并且根据不同的逻辑调用B、C、D方法。而B、C、D方法都是需要子类去实现的。子类只需要重写B、C、D方法即可,这就是模板设计模式

今天要说的是mybatis的事务,此时就涉及到了工厂设计模式。

Transaction接口有两个实现类:

1. JdbcTransaction:提供JDBC最基本的commit、close、rollback、getConnection功能

2. ManagedTransaction:只提供getConnection功能,其他功能需要让容器WebLogic、tomcat等去实现

 

 还提供了TransactionFactory接口:获取事务的实例对象

1. JdbcTransactionFactory                  负责生成JdbcTransaction对象

2. ManagedTransactionFactory:        负责生成 ManagedTransaction

而在我们配置Mybatis数据源信息的时候,我们会进行事务消息的配置:

此外,在Mybatis的核心类Configuration中,我们在构造方法中把具体的工厂类进行了别名注册。这样,我们只需要根据XML中配置的具体事务策略,就可以找到对应的工厂类,而工厂类负责生产处具体的事务对象,很巧妙

总结:

1. 事务这个模块是使用工厂设计模式进行coding的。Factory负责生成具体的事务。而事务又分为2种,具体使用哪一种事务是通过在xml文件中进行配置确定的。

2. 配置使用具体哪一个事务的这种设计,是典型的策略模式。你配置什么,我就用具体不同的策略。此处的策略是指使用JdbcTransaction,还是ManagedTransaction

说清楚了原理,那么进入源码分析

今天的核心是获取到SqlSession。 

1. 首先,就是根据我们在XML中配置的<enviroment>标签,找打<transactionManager>标签并获取到事务管理器的类型。此处是JDBC

 然后代码会获取到JdbcTransationFactory对象,由他来生成对应的事务对象。此处对应的事务应该是JdbcTransation。

 此时,我们回过头来去看XMLConfigBuilder对象的 environmentsElement 方法中去看看,它是如何根据xml的配置信息去生成工厂对象的

进一步跟进源码,我们可以确认如下信息。 

 此处,不知道大家有没有发现,这是模板设计模式呢?

2.  JDBCTransationFactory工厂类实例化JDBCTransation对象。

 

3. 生成执行器。 执行器后面详细讲

4. 最后,DefaultSqlSessionFactory new 出来一个 DefaultSqlSession

 

 而DefaultSqlSessionFactory 也是mybatis默认生成的。当我们使用建造者SqlSessionFactoryBuilder建造SqlSessionFactory 对象的时候,其实也是直接new出来它的子类DefaultSqlSessionFactory 

这个地方需要详细的分析一下 SqlSession 和 SqlSessionFactory 的架构了。其实又是一计工厂设计模式的运用。

观察一下发现,SqlSessionManager实现了SqlSession接口,也实现了SqlSessionFactory接口,根传统的工厂模式还不太一样。其实,我们可以发现,任何所谓的设计模式都是要符合业务需求的,可以根据业务的变化,设计模式本身也可以发生一些变化。

SqlSessionManager 和 DefaultSqlSession比较

1. SqlSessionManager 既是工厂类,也是SqlSession类,可以自己生产自己。而DefaultSqlSession只是一个SqlSession类。

2. SqlSessionManager 使用到了ThreadLocal,不同线程过来都会优先从ThreadLocal获取,获取不到才会生成新的SqlSession对象;

而DefaultSqlSession是由DefaultSqlSessionFactory创建的,每个线程过来DefaultSqlSessionFactory都会创建一个新的DefaultSqlSession。

从性能上来说,SqlSessionManager 性能更高

 

现在为止,我们已经接触了好几种设计模式了。光mybatis就使用了好几种组合设计模式了。比如 模板 + 工厂, 动态代理 + 工厂。 而在后面,我们还会接触到 适配器 + 工厂设计模式的组合。

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

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

相关文章

保姆级自动化测试教程(Selenium+java)

文章目录 自动化测试1. 自动化测试介绍2. Selenium介绍与环境搭建2.1 介绍2.2 Selenium原理2.3 SeleniumJava环境搭建 3. webdriver API3.1 元素的定位3.2 操作测试对象3.3 添加等待3.4 打印信息3.5 浏览器操作3.6 键盘事件3.7 鼠标事件3.9 特殊使用3.10 浏览器关闭3.11 切换窗…

让你不再好奇ai绘画生成器有哪些

绘画爱好者李明最近遇到了一个难题&#xff1a;他需要在短时间内完成一幅复杂的数字油画作品&#xff0c;但是他的手绘技能仍然不够熟练。于是&#xff0c;他想到了借助一些ai绘画软件来帮助他进行绘画创作。那么&#xff0c;你知道ai智能绘画软件有哪些吗&#xff1f;接下来我…

Vue中使用ElementUItable表格显示图片问题

1.问题 说明&#xff1a;table表格显示不了图片问题 品牌logo中显示的是url地址&#xff0c;因此我们要使用作用域插槽。 <template slot scope"{row,$index}"> </template> 说明&#xff1a;使用Vue的插槽功能&#xff0c;允许在当前列的内容上添加…

git暂存功能(只需要两步)

使用场景 我在写一个功能的时候发现一个bug&#xff0c;但是这个bug在我上一次提交的时候好像是没有的&#xff0c;所有我需要把当前的代码暂存,然后查看上一次提交是否正常。 一、暂存 暂存当前所有的修改 git stash二、恢复 恢复最近一次暂存&#xff0c;并把暂存删掉 …

获阿布扎比政府11亿美元投资将使蔚来改变电动汽车行业游戏规则?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结 &#xff08;1&#xff09;6月20日&#xff0c;蔚来宣布与阿布扎比政府控股的投资公司CYVN Holdings签订了股份认购协议&#xff0c;蔚来将获得CYVN Holdings11亿美元的战略投资&#xff0c;这可能会导致蔚来在阿布扎…

从零开始 Spring Boot 50:Entity Lifecyle Event

从零开始 Spring Boot 50&#xff1a;Entity Lifecyle Event 图源&#xff1a;简书 (jianshu.com) 在上篇文章&#xff0c;我介绍了 Hibernate 中的实体生命周期以及可以转换实体状态的 Session API。就像 Spring Bean 的生命周期拥有一些事件&#xff0c;通过监听这些事件我们…

C# 中【委托】的简单理解

先不说 C# 中的委托编程&#xff0c;先从生活中的例子入手。 场景一&#xff1a; 防疫期间&#xff0c;外卖人员不能进入花园小区。外卖小哥到了花园小区门口&#xff0c;只好【委托】花园的保安人员&#xff0c;把东西送上楼去。 场景二&#xff1a; 有资格的人&#xff0c;都…

慢谈漫威--来龙去脉

慢谈漫威 背景介绍一、抛开电影看漫威相关公司背景、关系二、漫威宇宙和索尼漫威宇宙三、 漫威宇宙四、话外--美国6大影视公司 背景介绍 最近在看一部漫威电影&#xff0c;可能是年纪大了&#xff0c;看美国英雄大片以及系列电影提不起兴趣&#xff0c;各种人物背景关系也不清…

途乐证券|光伏概念发力上扬,好利科技涨停,隆基绿能等拉升

光伏概念28日盘中发力上扬&#xff0c;截至发稿&#xff0c;露笑科技、好利科技、宁波能源等涨停&#xff0c;中国动力、欧晶科技、聚合材料、鹿山新材等涨超5%&#xff0c;帝科股份、隆基绿能、福斯特等涨超3%。 露笑科技昨日晚间披露的半年度业绩预告&#xff0c;预计上半年归…

ST - 如何下载带有.ioc的官方工程

文章目录 ST - 如何下载带有.ioc的官方工程概述下载带有.ioc文件的官方工程的方法备注END ST - 如何下载带有.ioc的官方工程 概述 有些CubeMX的官方工程, 自己复现不出来. 但是官方工程是好使的. 这是, 可能差别就在工程配置上. 如果仅仅靠BC4比对官方工程和自己重建的工程, …

简单指令实现Docker构建镜像启动运行保存导出后再导入新环境完整全流程

项目场景及问题描述 本文做一个简单Docker使用指令指南&#xff0c;可快速实现Docker构建镜像、启动、运行、保存、导出后再导入新环境完整全流程。具体每一个指令又有很多参数和学问&#xff0c;大家可自行查询更详细的解释&#xff0c;本文可用于小白快速构建镜像并使用。 使…

【doxygen】doxygen 支持 markdown 公式

文章目录 配置 doxygenmarkdown 文件中插入公式在段落中插入公式公式居中显示公式分行显示效果展示 参考链接 配置 doxygen 在 Doxygen 配置文件&#xff08;通常是 Doxyfile &#xff09;中&#xff0c;确保以下选项已启用或设置&#xff1a; MARKDOWN_SUPPORT &#xff1a;设…

100种思维模型之心流理论思维模型-86

亚里士多德说&#xff0c; 人类的终极目标是获得幸福 &#xff01; 那么到底什么是幸福&#xff1f;如何才能获得幸福&#xff1f; 米哈里契克森米哈赖&#xff0c; 积极心理学奠基人之一&#xff0c; “心流” 理论的提出者&#xff0c;他在其著作《心流》一书中这样写道…

操作系统4——存储器管理

本系列博客重点在深圳大学操作系统课程的核心内容梳理&#xff0c;参考书目《计算机操作系统》&#xff08;有问题欢迎在评论区讨论指出&#xff0c;或直接私信联系我&#xff09;。 梗概 本篇博客主要介绍操作系统第四章存储器管理与第五章虚拟存储器的相关知识。 目录 一、…

辛苦写的文章在自媒体上难以盈利的原因分析!

自媒体是指个人或组织通过互联网自主开设自己的媒体平台&#xff0c;并在其平台上发布原创内容&#xff0c;获取流量并从中获得收益的一种模式。自媒体的发展可以让更多的人有机会成为内容创作者&#xff0c;并能够通过自己的努力获得收益&#xff0c;但实际情况是&#xff0c;…

Linux ps命令常见实战用法

文章目录 一、基本介绍1.1 基本介绍1.2 常用参数1.3 字段含义 二、常见用法2.1 查看所有进程2.2 查看特定进程信息 参考资料 Linux中的ps命令是Process Status的缩写。当程序运行在系统上时&#xff0c;我们称之为进程。想监测这些进程&#xff0c;需要熟悉ps命令的用法。ps能输…

2023一造土建安装案例《十年真题▪九套模拟》

造价工程师&#xff0c;是指通过全国统一考试取得中华人民共和国造价工程师执业资格证书&#xff0c;并经注册后从事建设工程造价工作的专业人员。国家对造价工程师实行准入类职业资格制度&#xff0c;纳入国家职业资格目录。凡从事工程建设活动的建设、设计、施工、造价咨询等…

合合信息智能文字识别产品通过中国信通院“可信AI—OCR智能化服务”评估

近年来&#xff0c;我国对数据的重视程度不断加强。2022年1月&#xff0c;国务院印发的《“十四五”数字经济发展规划》进一步提出&#xff0c;到2025年要初步建立数据要素市场体系&#xff0c;并对充分发挥数据要素价值作出重要部署。然而&#xff0c;现阶段有大量的数据信息以…

Java ~ Executor ~ AbstractExecutorService【总结】

前言 文章 相关系列&#xff1a;《Java ~ Executor【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Executor ~ AbstractExecutorService【源码】》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;相关系列&#xff1a;《Java ~ Execu…

《痞子衡嵌入式半月刊》 第 78 期

痞子衡嵌入式半月刊&#xff1a; 第 78 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻&#xff0c;农历年分二十四节气&#xff0c;希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly)&#xff0c;欢迎提交 issue&#xff0c…