这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战
Mybatis设计模式
前言
虽然设计模式有3类23种设计模式,但是⼤多停留在概念层⾯,Mybatis源码中使⽤了⼤量的设计模式,观察设计模式在其中的应⽤,能够更深⼊的理解设计模式。
Mybatis⾄少⽤到了以下的设计模式的使⽤:
模式 | mybatis体现 |
---|---|
Builder模式 | 例如SqlSessionFactoryBuilder、Environment; |
⼯⼚⽅法模式 | 例如SqlSessionFactory、TransactionFactory、LogFactory |
单例模式 | 例如 ErrorContext 和 LogFactory; |
代理模式 | Mybatis实现的核⼼,⽐如MapperProxy、ConnectionLogger,⽤的jdk的动态代理还有executor.loader包使⽤了 cglib或者javassist达到延迟加载的效果 |
组合模式 | 例如SqlNode和各个⼦类ChooseSqlNode等; |
模板⽅法模式 | 例如 BaseExecutor 和 SimpleExecutor,还有 BaseTypeHandler 和所有的⼦类例如 IntegerTypeHandler; |
适配器模式 | 例如Log的Mybatis接⼝和它对jdbc、log4j等各种⽇志框架的适配实现; |
装饰者模式 | 例如Cache包中的cache.decorators⼦包中等各个装饰者的实现; |
迭代器模式 | 例如迭代器模式PropertyTokenizer; |
1 Builder构建者模式
Builder模式的定义是”将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”,它属于创建类模式,⼀般来说,如果⼀个对象的构建⽐较复杂,超出了构造函数所能包含的范围,就可以使⽤⼯⼚模式和Builder模式,相对于⼯⼚模式会产出⼀个完整的产品,Builder应⽤于更加 复杂的对象的构建,甚⾄只会构建产品的⼀个部分,直⽩来说,就是使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象
例⼦:使⽤构建者设计模式来⽣产computer 主要步骤:
- 1、将需要构建的⽬标类分成多个部件(电脑可以分为主机、显示器、键盘、⾳箱等部件);
- 2、 创建构建类;
- 3、 依次创建部件;
- 4、 将部件组装成⽬标对象
1. 定义computer
2. ComputerBuilder
调⽤
2. Mybatis中的体现
SqlSessionFactory 的构建过程:
Mybatis的初始化⼯作⾮常复杂,不是只⽤⼀个构造函数就能搞定的。所以使⽤了建造者模式,使⽤了⼤量的Builder,进⾏分层构造,核⼼对象Configuration使⽤了 XmlConfigBuilder来进⾏构造。
在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调⽤XMLConfigBuilder读取所有的MybatisMapConfig.xml 和所有的 *Mapper.xml ⽂件,构建 Mybatis 运⾏的核⼼对象Configuration对象,然后将该Configuration对象作为参数构建⼀个SqlSessionFactory对象。
其中 XMLConfigBuilder 在构建 Configuration 对象时,也会调⽤ XMLMapperBuilder ⽤于读取Mapper⽂件,⽽XMLMapperBuilder会使⽤XMLStatementBuilder来读取和build所有的SQL语句。
1 | java复制代码//解析<mappers />标签 |
在这个过程中,有⼀个相似的特点,就是这些Builder会读取⽂件或者配置,然后做⼤量的XpathParser 解析、配置或语法的解析、反射⽣成对象、存⼊结果缓存等步骤,这么多的⼯作都不是⼀个构造函数所能包括的,因此⼤量采⽤了 Builder模式来解决
SqlSessionFactoryBuilder类根据不同的输⼊参数来构建SqlSessionFactory这个⼯⼚对象。因此Mybatis使用builder建造者模式就差不多啦,后续还会更新其他设计模式在mybatis的使用
本文转载自: 掘金