从 Mybatis 源码中,学习到的 10 种设计模式

MyBatis源码剖析 在二级缓存的设计上,MyBatis大量的运用了装饰者模式,如CacheExecutor,以及各种Cache接口的装饰器。二级缓存实现了sqlSession之间的缓存数据共享,属于namespace级别;二级缓存具有丰富的缓存策略;二级缓存可由多个装饰器与基础缓存组合而成;二级缓存工作由一个缓存装饰器CacheExecutor和一个事务型预缓存TransactionalCache完成。问题:在开发过程中很多时候我们并不总是需要在获取用户信息的时候加载订单信息,此时就是我们所说的延迟加载。 阅读详情

一、前言:小镇卷码家

总有不少研发伙伴问小傅哥:“为什么学设计模式、看框架源码、补技术知识,就一个普通的业务项目,会造飞机不也是天天写 CRUD 吗?”

你说的没错,但你天天写 CRUD,你觉得 烦不? 慌不? 是不是既担心自己没有得到技术成长,也害怕将来没法用这些都是 CRUD 的项目去参加;述职、晋升、答辩,甚至可能要被迫面试时,自己手里一点干货也没有的情况。

所以你/我作为一个小镇卷码家,当然要扩充自己的知识储备,否则架构,架构思维不懂、设计,设计模式不会、源码、源码学习不深,最后就用一堆 CRUD 写简历吗?

二、源码:学设计模式

在 Mybatis 两万多行的框架源码实现中,使用了大量的设计模式来解耦工程架构中面对复杂场景的设计,这些是设计模式的巧妙使用才是整个框架的精华,这也是小傅哥喜欢卷源码的重要原因。经过小傅哥的整理有如下 10 种设计模式的使用,如图所示

讲道理,如果只是把这 10 种设计模式背下来,等着下次面试的时候拿出来说一说,虽然能有点帮助,不过这种学习方式就真的算是把路走窄了。就像你每说一个设计模式,能联想到这个设计模式在 Mybatis 的框架中,体现到哪个流程中的源码实现上了吗?这个源码实现的思路能不能用到你的业务流程开发里?别总说你的流程简单,用不上设计模式!难到因为有钱、富二代,就不考试吗?🤔

好啦,不扯淡了,接下来小傅哥就以《手写Mybatis:渐进式源码实践》的学习,给大家列举出这 10 种设计模式,在 Mybatis 框架中都体现在哪里了!

三、类型:创建型模式

1. 工厂模式

源码详见:cn.bugstack.mybatis.session.SqlSessionFactory

public interface SqlSessionFactory {
  
  
   SqlSession openSession();
}

复制代码

源码详见:cn.bugstack.mybatis.session.defaults.DefaultSqlSessionFactory

public class DefaultSqlSessionFactory implements SqlSessionFactory {
  
  
    private final Configuration configuration;
    public DefaultSqlSessionFactory(Configuration configuration) {
  
          this.configuration = configuration;    }
    @Override    public SqlSession openSession() {
  
          Transaction tx = null;        try {
  
              final Environment environment = configuration.getEnvironment();            TransactionFactory transactionFactory = environment.getTransactionFactory();            tx = transactionFactory.newTransaction(configuration.getEnvironment().getDataSource(), TransactionIsolationLevel.READ_COMMITTED, false);            // 创建执行器            final Executor executor = configuration.newExecutor(tx);            // 创建DefaultSqlSession            return new DefaultSqlSession(configuration, executor);        } catch (Exception e) {
  
              try {
  
                  assert tx != null;                tx.close();            } catch (SQLException ignore) {
  
              }            throw new RuntimeException("Error opening session.  Cause: " + e);        }    }
}

复制代码

  • 工厂模式:简单工厂,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例对象的类型。

  • 场景介绍:SqlSessionFactory 是获取会话的工厂,每次我们使用 Mybatis 操作数据库的时候,都会开启一个新的会话。在会话工厂的实现中负责获取数据源环境配置信息、构建事务工厂、创建操作 SQL 的执行器,并最终返回会话实现类。

  • 同类设计:SqlSessionFactory、ObjectFactory、MapperProxyFactory、DataSourceFactory

2. 单例模式

源码详见:cn.bugstack.mybatis.session.Configuration

public class Configuration {
  
  
    // 缓存机制,默认不配置的情况是 SESSION    protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION;
    // 映射注册机    protected MapperRegistry mapperRegistry = new MapperRegistry(this);
    // 映射的语句,存在Map里    protected final Map<String, MappedStatement> mappedStatements = new HashMap<>();    // 缓存,存在Map里    protected final Map<String, Cache> caches = new HashMap<>();    // 结果映射,存在Map里    protected final Map<String, ResultMap> resultMaps = new HashMap<>();    protected final Map<String, KeyGenerator> keyGenerators = new HashMap<>();
    // 插件拦截器链    protected final InterceptorChain interceptorChain = new InterceptorChain();
    // 类型别名注册机    protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();    protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();
    // 类型处理器注册机    protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
    // 对象工厂和对象包装器工厂<
MyBatis ORM 框架源码设计模式的运用实例 通过梳理,MyBatis大约运用了10种左右设计模式。可以说,复杂且优秀的ORM 框架源码在设计和实现的过程中都会使用大量的设计模式。在解决复杂场景的问题时,需要采用分治、抽象的方法,运用设计模式和设计原则等相关知识,把问题合理切割为若干子问题,以便加以理解和解决。学习源码远不是只是为了应付面试,更重要的是学习优秀框架在复杂场景下的解决方案。通过学习这些优秀的方案技术,可以提高对技术设计和实现的理解,扩展编码思维,积累落地经验。只有经过这样长期的积累,我们才更有可能成为优秀的高级工程师和架构师。 阅读详情

相关推荐

Android AI Agent集成实战:架构设计与自动化技能开发

AI Agent(人工智能代理)是一种能够感知环境、自主规划并执行任务以达成目标的软件实体。其核心原理在于结合大语言模型的推理能力与工具调用(Tool Calling)技术,使应用从被动响应转向主动服务。在移动开发领域,这项技术的价值在于为应用注入“智能大脑”,实现跨应用自动化与个性化交互,从而显著提升用户体验和操作效率。具体到Android平台,其应用场景广泛,例如自动填写表单、智能聊天辅助、个性化工作流优化等。本文聚焦于Android AI Agent的工程化落地,深入探讨了如何利用Accessibil

weixin_42636895的博客 661

从零到一:DETR模型在自定义数据集上的实战部署与调优

本文详细介绍了DETR模型在自定义数据集上的实战部署与调优过程,包括环境准备、数据转换、模型配置、训练技巧及问题排查。通过具体代码示例和实用建议,帮助开发者高效完成从零到一的DETR模型部署,特别适合目标检测领域的实践应用。

weixin_42524100的博客 462

Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示

通过以上步骤,我们实现了Flutter加载本地HTML的完整流程,并简单介绍了如何通过WebView与HTML页面进行交互。HTML文件作为一种灵活、易维护的富文本展示方式,能有效提升Flutter应用的内容呈现能力。这种方法在展示新闻、资讯或帮助文档等内容时非常有用,能够让开发者灵活调整内容的样式和排版。希望这篇文章能对你在Flutter开发中的HTML加载有所帮助!

四楼没电梯的专栏 3641

金融科技数据源

数字金融开放研究平台

平平淡淡,戒急用忍,一生学闭嘴。 1758

易盾滑块的js逆向分析

基于易盾的滑块验证码进行逆向分析,最种实现全系列的验证码逆向,包括滑块、点选、推理拼图等多种类型。

shanf7921的博客 3万+

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上)

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上):慢时钟域到快时钟域!

悟已往之不谏 知来者之可追 1544

通过 MATLAB/Simulink + Simscape Battery,构建了锂电池老化模型与容量衰减仿真系统

本文基于MATLAB/Simulink平台,构建锂电池老化模型与容量衰减仿真系统,研究储能电池健康管理技术。通过搭建电化学-老化耦合模型,模拟循环和日历老化机制,分析温度、充放电倍率、DOD等因素对电池寿命的影响。系统实现了SOH在线估计和RUL预测功能,仿真了标准日历老化、高倍率循环和峰谷套利等典型工况下的电池衰减行为。结果表明:高温和深充放会显著加速电池老化,而精准的SOH管理可提升储能系统经济性30%以上。文章还探讨了数字孪生、机器学习等高级优化方向,为储能系统长周期运营提供技术支撑。

xiaoheshang_123的博客 398

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色。

非科班Java出身GISer的博客 400

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 码农会锁,synchronized 对象头结构 (mark-word、Klass Pointer)、指针压缩、锁竞争,源码解毒、深度分析!
下一篇: 低延迟的超时中心实现方式
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值