设计模式在Mybatis中的应用

掌握设计模式的难度在于每个模式看上去都能够理解但就是不知道如何应用,固然在日常开发过程中多尝试应用设计模式有助于提高自身的设计能力,但通过阅读源代码的方式来加深对设计模式的理解和掌握是一条捷径。目前非常主流的开源ORM框架Mybatis(http://www.mybatis.org/)中大量用到了设计模式,这里举几个典型的场景分析如何将设计模式应用到Mybatis框架设计中,包括建造者模式、工厂模式、模板方法模式、单例模式、装饰器模式等。

在Mybatis中存在一批以Builder结尾的类,这些类基本都是建造者模式的具体体现。例如SqlSessionFactoryBuilder其目的就是构建SqlSessionFactory,在Mybatis环境的初始化过程中,会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml和所有的*Mapper.xml文件,构建Mybatis运行的核心对象Configuration对象,然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。而XMLConfigBuilder在构建Configuration对象时,也会调用XMLMapperBuilder用于读取*Mapper文件,而XMLMapperBuilder会使用XMLStatementBuilder来读取和构建所有的SQL语句。在这些过程中,有一个相似的特点,就是这些Builder会读取文件或者配置,然后做大量的XpathParser解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤,这些工作都不适合简单的通过构造函数来提供初始化服务,因此大量采用了建造者模式来解决。

又如常见的工厂模式在Mybatis也体现在一系列以Factory结尾的工厂类,最典型的就是DefaultSqlSessionFactory类,该Factory的openSession方法重载了很多个,分别支持autoCommit、Executor、Transaction等参数的输入来构建核心的SqlSession对象。

在Mybatis中,SqlSession的SQL执行,都是委托给Executor实现的,Executor包含如下图中的类层结构,其中的BaseExecutor就采用了模板方法模式,它实现了大部分的SQL执行逻辑,然后把以下几个方法交给子类定制化完成。这几个子类的具体实现使用了不同的策略,体现了模板方法模式基于继承的代码复用技术。

针对单例模式,在Mybatis中有两个地方用到该模式,即ErrorContext和LogFactory。其中ErrorContext是用在每个线程范围内的单例,用于记录该线程的执行环境错误信息,而LogFactory则是提供给整个Mybatis使用的日志工厂,用于获得针对项目配置好的日志对象。以ErrorContext为例,构造函数是private修饰,具有一个static的局部instance变量和一个获取instance变量的方法,在获取实例的方法中,先判断是否为空如果是的话就先创建,然后返回构造好的对象。

装饰器模式在Mybatis主要应用在对缓存的处理上。在Mybatis中,缓存的功能由根接口Cache定义,整个体系采用装饰器设计模式,数据存储和缓存的基本功能由PerpetualCache永久缓存实现,然后通过一系列的装饰器来对PerpetualCache永久缓存进行缓存策略等方便的控制。用于装饰PerpetualCache的标准装饰器包括FifoCache、LruCache、LoggingCache等共计8个,通过类似Cache cache = new LoggingCache(new PerpetualCache("cacheid"))的方式实现装饰。

如果对文章感兴趣,可以关注我的微信公众号:程序员向架构师转型,或扫描下面的二维码。

我出版了《系统架构设计:程序员向架构师转型之路》、《向技术管理者转型:软件开发人员跨越行业、技术、管理的转型思维与实践》、《微服务设计原理与架构》、《微服务架构实战》等书籍,并翻译有《深入RabbitMQ》和《Spring5响应式编程实战》,欢迎交流。

 

发布了92 篇原创文章 · 获赞 9 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/lantian08251/article/details/99613686