Mybatis源码学习第一课---基础支撑层日志模块分析

本文深入剖析MyBatis的基础支撑层,特别是日志模块,揭示了适配器设计模式如何统一不同日志框架的接口,以及代理模式在JDBC调试中的应用。通过适配器模式,MyBatis实现了对Log4j、Log4j2等日志组件的兼容,而代理模式则用于JDBC操作的动态追踪和日志记录,为开发和调试带来便利。

MyBatis 源码下载地址:https://github.com/mybatis/mybatis-3

一、mybatis整体架构

   mybatis 整体架构主要分为三个层次:接口层、核心处理层、基础支撑层。如下图:

            

二、基础支撑层源码分析

           基础支持层位于Mybatis整体架构的最底层,支撑着Mybatis的核心处理层,是整个框架的基石。基础支持层中封装了多个较为通用、独立的模块,不仅仅为mybatis提供基础支撑,也可以在合适的场景直接复用。如下图:

          

三 日志模块源码解析

     良好的日志在一个软件中占了非常重要的地位,日志是开发与运维管理之间的桥梁。 日志 可以帮助运维人员和管理人员快速查找系统的故障和瓶颈,也可以帮助开发人员与运维人员沟 通, 更好地完成开发和运维任务。 但日志的信息量会随着软件运行时间不断变多,所以需要定 期汇总和清理,避免影响服务器的正常运行。

         在 Java 开发中常用的日志框架有 Log4j、 Log4j2、 Apache Commons Log、 java.util.logging、 slf.句等,这些工具对外的接口不尽相同。为了统一这些工具的接口, MyBatis 定义了一套统一 的日志接口供上层使用 , 并为上述常用的日志框架提供了相应的适配器

   日志模块使用适配器 设计模式

3.1、设计模式中有六大原则

   单一职责原则: 不要存在多于一个导致类变更的原因,简单来说, 一个类只负责唯一 项职责。

   里氏替换原则:如果对每一个类型为 Tl 的对象 tl ,都有类型为 T2 的对象 t2,使得以 Tl 定义的所有程序 P 在所有的对象 tl 都代换成 t2 时,程序 P 的行为没有发生变化, 那么类型 T2 是类型 Tl 的子类型。遵守里氏替换原则,可以帮助我们设计出更为合 理的继承体系。

    依赖倒置原则: 系统的高层模块不应该依赖低层模块的具体实现, 二者都应该依赖其 抽象类或接口,抽象接口不应该依赖具体实现类,而具体实现类应该于依赖抽象。简 单来说,我们要面向接口编程。 当需求发生变化时对外接口不变,只要提供新的实现 类即可。

    接口隔离原则: 一个类对另一个类的依赖应该建立在最小的接口上。简单来说,我们 在设计接口时,不要设计出庞大膝肿的接口,因为实现这种接口时需要实现很多不必 要的方法。 我们要尽量设计出功能单一的接口,这样也能保证实现类的职责单一。

    迪米特法则: 一个对象应该对其他对象保持最少的了解。 简单来说,就是要求我们减 低类间祸合。

    开放-封闭原则: 程序要对扩展开放,对修改关闭。简单来说,当需求发生变化时,我 们可以通过添加新的模块满足新需求,而不是通过修改原来的实现代码来满足新需求。

     在这六条原则中,开放-封闭原则是最基础的原则,也是其他原则以及后文介绍的所有设计 模式的最终目标

3.2 适配器设计模式

         适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的
另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;

       这里先介绍 适配器模式中涉及的几个角色,如下所述。

        1、目标接口(Target):调用者能够直接使用的接口 。

        2、需要适配的类(Adaptee): 一般情况下, Adaptee 类中有真正的业务逻辑,但是其接口 不能被调用者直接使用。

        3、适配器(Adapter): Adapter 实现了 Target 接口,并包装了一个 Adaptee 对象。 Adapter 在实现 Target 接口中的方法时,会将调用委托给 Adaptee 对象的相关方法,由 Adaptee 完成具体的业务。 

         

           使用适配器模式的好处就是复用现有组件。应用程序需要复用现有的类,但接口不能被该 应用程序兼容,则无法直接使用。这种场景下就适合使用适配器模式实现接口的适配,从而完 成组件的复用。很明显,适配器模式通过提供 Adapter 的方式完成接口适配,实现了程序复用 Adaptee 的需求,避免了修改 Adaptee 实现接口,这符合“开放-封闭”原则。当有新的 Adaptee 需要被复用时,只要添加新的 Adapter 即可,这也是符合“开放一封闭”原则的。 在 MyBatis 的日志模块中,就使用了适配器模式。

       MyBatis 内部调用其日志模块时,使用 了其内部接口(也就是后面要介绍的 org.apache. atis.logging.Log 接口)。但是 Log4j、 Log4j2 等第三方日志组件对外提供的接口各不相同, MyBatis 为了集成和复用这些第三方日志组件, 在其日志模块中提供了多种 Adapter ,将这些第 三方日志 组件对外的接口适配成 了 org.apach巳. atis.logging.Log 接口,这样 MyBatis 内部就可以统一通过 org.apache.ibatis.logging. Log 接口调用第三方日志组件的功能了。

     当程序中存在过多的适配器时,会让程序显得非常复杂(后续介绍的所有模式都会有该问 题,但是与其带来的好处进行权衡后,这个问题可以忽略不计),增加了把握住核心业务逻辑的 难度,例如,程序调用了接口 A,却在又被适配成了接口 B。 如果程序中需要大量的适配器, 则不再优先考虑使用适配器模式,而是考虑将系统进行重构,这就需要设计人员进行权衡。

 3.3 日志适配器模块源码解析

       日志模块总体图组:

       

            前面描述的多种第三方日志组件都有各自的 Log 级别,且都有所不同,例如 java.util.logging 提供了 All、 F卧而ST、 FINER、 FINE、 CONFIG、卧.WO、 W成NING 等 9 种级别,而 Log句2 则 只有 trace、 debug、 info、 warn、 eηor、 fatal 这 6 种日志级别。

          MyBatis 统一提供了 trace、 debug、 warn、 eηor 四个级别,这基本与主流日志框架的日志级别类似,可以满足绝大多数场景的日志 需求。 My Batis 的日志模块位于 org.apache.ibatis.logging 包中,该模块中通过 Log 接口定义了日志 模块的功能,当然日志适配器也会实现此接口。 LogFactory 工厂类负责创建对应的日志组件适配器。

                          

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值