Mybatis中用到的设计模式

1. 建造者(Builder)模式:

  表示一个类的构建与类的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,他只允许用户只通过指定复杂对象的类型和内容就可以构建它们。

  比如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder。

  SqlSessionFactoryBuilder为例。模式结构:SqlSessionFactoryBuilder为具体的建造者,他没有抽象建造者父类,因为只有它一个,构建完生命周期也结束了,SqlSessionFactoryBuilder依赖于SqlSessionFactory,SqlSessionFactory的构建交给SqlSessionFactoryBuilder,表示SqlSessionFactory类的构建(SqlSessionFactoryBuilder)与SqlSessionFactory类的表示分离。

2. 工厂方法模式:

  核心的工厂类不再负责所有产品的创建,而是将创建的工作交给产品接口的子类去做,这个工厂类必须为其实现接口,而不负责某一类产品实例化这种细节。

  比如SqlSessionFactory、MapperProxyFactory、ObjectFactory。

  以构建SqlSessionFactory为例。模式结构为:具体工厂DefaultSqlSessionFactory生产具体产品DefaultSqlSession ,具体产品有一抽象产品接口SqlSession,DefaultSqlSessionFactory有一个抽象工厂接口SqlSessionFactory

Mapper的配置映射

3. 装饰者模式:

  动态地给一个对象增加一些额外的职责,装饰模式比实现子类效率会高,可以称为包装器。

  比如说Mybatis的执行器。模式结构:Executer(抽象构件),CachingExecutor(具体构件),BaseExecutor(抽象装饰类),SimpleExecutor 和 ReuseExecutor(具体装饰类)。

  还有Mybatis的缓存Cache,Cache (组件对象的接口),PerpetualCache(具体组件,是我们需要装饰的对象),LruCache等其他类(具体装饰类,被装饰的对象)

org.apache.ibatis.cache包结构:

4. 适配器模式:

  将一个类的接口转换成希望的另外一个接口。

  最常见于logger日志那一块。

  模式结构:Log就是要转化的目标接口(Target ),各个子包下的实现类就是各种日志框架的适配器(Adapter),在这个Mybatis包之外的日志框架的Logger就是要适配的类(Adaptee)

5. 代理模式:

  JDK的动态代理,详见 探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析

6. 模板模式:

  定义一个抽象类,里面有一系列基本操作,这些操作可以是具体的,也可以是抽象的,每一个基本步骤对应算法的一个步骤,再其子类中可以重定义并实现一个算法的各个步骤。

  比如说Myabtis中抽象的执行器BaseExecutor。模式结构:抽象类BaseExecutor,具体子类主要是SimpleExecutor、ReuseExecutor、BatchExecutor这三个。

7. 单例模式:

  保证一个类仅有一个实例。

  比如说ErrorContext、LoggerFactory

  ErrorContext:

  LogFactory:

  LogFactory是用自己的class和要被适配的日志类的class,通过setImplementation用Construction构建起来的一个单例logConstructor,tryImplementation保证它是单例的。

 1 private static void tryImplementation(Runnable runnable) {
2 if (logConstructor == null) {
3 try {
4 runnable.run();
5 } catch (Throwable t) {
6 // ignore
7 }
8 }
9 }
10
11 private static void setImplementation(Class<? extends Log> implClass) {
12 try {
13 Constructor<? extends Log> candidate = implClass.getConstructor(String.class);
14 Log log = candidate.newInstance(LogFactory.class.getName());
15 if (log.isDebugEnabled()) {
16 log.debug("Logging initialized using '" + implClass + "' adapter.");
17 }
18 logConstructor = candidate;
19 } catch (Throwable t) {
20 throw new LogException("Error setting Log implementation. }

8. 组合模式

9. 迭代器模式

(未完待续)

MyBatis源码分析(八):设计模式的更多相关文章

  1. MyBatis源码分析(4)—— Cache构建以及应用

    @(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...

  2. MyBatis源码分析(2)—— Plugin原理

    @(MyBatis)[Plugin] MyBatis源码分析--Plugin原理 Plugin原理 Plugin的实现采用了Java的动态代理,应用了责任链设计模式 InterceptorChain ...

  3. 【MyBatis源码分析】select源码分析及小结

    示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...

  4. Mybatis源码分析-BaseExecutor

    根据前文Mybatis源码分析-SqlSessionTemplate的简单分析,对于SqlSession的CURD操作都需要经过Executor接口的update/query方法,本文将分析下Base ...

  5. Mybatis源码分析之Cache二级缓存原理 (五)

    一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(Ser ...

  6. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  7. MyBatis源码分析-SQL语句执行的完整流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  8. MyBatis源码分析(5)——内置DataSource实现

    @(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...

  9. MyBatis源码分析(3)—— Cache接口以及实现

    @(MyBatis)[Cache] MyBatis源码分析--Cache接口以及实现 Cache接口 MyBatis中的Cache以SPI实现,给需要集成其它Cache或者自定义Cache提供了接口. ...

  10. MyBatis源码分析之环境准备篇

    前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...

随机推荐

  1. expression select表达式动态构建

    参考: http://blog.csdn.net/tastelife/article/details/7340205 http://blog.csdn.net/sweety820/article/de ...

  2. 【转】shell脚本中echo显示内容带颜色的实现方法

    shell脚本中echo显示内容带颜色的实现方法 shell脚本里使用echo输出颜色  

  3. Android通过WebView实现新闻界面的加载

    原文链接:Android实现WebView加载网页及网页美化(简易新闻 四)_Tobey_r1的博客-CSDN博客 效果展示: 我是按照原文作者的步骤一步步来的,中间没有遇到什么问题.主要是界面中有很 ...

  4. Django学习day15BBS项目开发3.0

    每日测验 """ 今日考题 1.django admin作用及用法 2.media配置如何实现,基于该配置能够做到什么以及需要注意什么 3.阐述博客园为何支持用户自定义个 ...

  5. Linux系列(40) - 自动同步时间chrony

    前言 Centos8开始取消了ntp同步时间,改为chrony同步 chrony工具安装 yum -y install chrony 修改配置文件 将配置文件中的同步服务器修改为国内的时间服务器(推荐 ...

  6. AT4353-[ARC101D]Robots and Exits【LIS】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4353 题目大意 数轴上有\(n\)个球\(m\)个洞,每次可以将所有球左移或者右移,球到洞的位置会掉下去. 求 ...

  7. P4590-[TJOI2018]游园会【dp套dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为\(m\)的字符串\(s\). 对于每个\(k\in[0,m]\)求有多少个长度为 ...

  8. Pycharm软件学生和老师可申请免费专业版激活码

    有一种邮箱,叫做教育邮箱,这东西在这个互联网的世界有很大的优惠及特权,在 Jetbrain 这里, 如果你有教育邮箱(没有教育邮箱怎么办?.edu.cn后缀的邮箱)但很多学生.甚至老师都未必有. 你只 ...

  9. IdentityServer4[5]简化模式

    Implicit简化模式(直接通过浏览器的链接跳转申请令牌) 简化模式是相对于授权码模式而言的.其不再需要[Client]的参与,所有的认证和授权都是通过浏览器来完成的. 创建项目 IdentityS ...

  10. 如何借助 JuiceFS 为 AI 模型训练提速 7 倍

    背景 海量且优质的数据集是一个好的 AI 模型的基石之一,如何存储.管理这些数据集,以及在模型训练时提升 I/O 效率一直都是 AI 平台工程师和算法科学家特别关注的事情.不论是单机训练还是分布式训练 ...