Mybatis源码分析_日志模块 (1)

这篇具有很好参考价值的文章主要介绍了Mybatis源码分析_日志模块 (1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

不得不承认,学习MyBatis的时间成本要比学习Spring低很多,Mybatis是我所了解过的代码量最小、整体架构最简单,但是又是最具有学习价值的一个框架。如果,你想快速的阅读一个框架的源码,并且掌握这个框架的精髓,那么Mybatis一定是你的首选。

在开始我们的源码阅读之前,我们先来学习一个设计模式:

适配器模式

Mybatis源码分析_日志模块 (1)

 大话数据结构是这样解释的:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的哪些类可以在一起工作,这就是适配器模式。

什么意思呢?

简单解释一下,客户方希望调用一个类的 A ,B方法, 但是这个类是第三方框架的,或者说这个类早就写好了,不可能因为你的想法而改变。而这个类有C, D 方法。那么怎么办呢?这时候我们可以定义一个类,类中定义A,B方法, 而A方法就是简单的调用C方法,B方法就是简单的调用D方法,这就是适配器模式的雏形。

当需要定义很多个这样的类的时候,我们就可以定义一个接口,而这些需要定义的类都来实现这个接口,这就是适配器模式了。

代码说明:

被适配对象,也就是说这个类早就存在了,不允许更改。

package com.sjmx.adapter;

//已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class Adaptee1 {
    
    public void specificRequest() {
        System.out.println("被适配类具有 特殊功能1...");
    }
    
}
package com.sjmx.adapter;

//已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class Adaptee2 {
    
    public void verifyRequest() {
        System.out.println("被适配类具有 特殊功能2...");
    }
    
}

但是客户方希望调用这两个类,并且这两个类的方法名都必须是 aRequest(), 怎么办呢?这时候就需要适配器模式发光发热了。

首先定义一个接口:

package com.sjmx.adapter;

//目标接口,或称为标准接口
public interface Target {
    public void aRequest();
}

定义两个实现类Adapter1 和Adapter2,分别对应Adaptee1 和 Adaptee2.

package com.sjmx.adapter;

//适配器类,直接关联被适配类,同时实现标准接口
public class Adapter1 implements Target {
    
    // 直接关联被适配类
    private Adaptee1 adaptee;
        
    // 可以通过构造函数传入具体需要适配的被适配类对象
    public Adapter1 () {
        this.adaptee = new Adaptee1();
    }
    
    public void aRequest() {
        // 这里是使用委托的方式完成特殊功能
        this.adaptee.specificRequest();
    }

}
package com.sjmx.adapter;

//适配器类,直接关联被适配类,同时实现标准接口
public class Adapter2 implements Target {
    
    // 直接关联被适配类
    private Adaptee2 adaptee;
        
    // 可以通过构造函数传入具体需要适配的被适配类对象
    public Adapter2 () {
        this.adaptee = new Adaptee2();
    }
    
    public void aRequest() {
        // 这里是使用委托的方式完成特殊功能
        this.adaptee.verifyRequest();
    }

}

模拟客户方调用:

package com.sjmx.adapter;

public class Client {
    
    public static void main(String[] args) {
        
        //调用Adaptee1
        Target adapter = new Adapter1();
        adapter.arequest();

        //调用Adaptee2
        Target adapter = new Adapter2();
        adapter.arequest();
    }
}

客户方只知道有这么个接口,并且还需要知道这个接口对应的实现类,然后根据自己的需要自己去new出来实现类并且调用符合规范的方法就ok了,这就是完整的适配器模式。

这个设计模式很大的解决了客户的新需求与老系统的兼容性问题,但是它也是有缺点的。比如,我们的客户方每次调用都需要适配器对应的类是谁,功能是干嘛的,增加了代码的耦合度。而且,一旦哪天某一个具体的Adapter废弃掉了,或者类改名字了,但是这个类在客户方大量使用,我们是不是要到客户方代码中,把所有调用这个类的地方都得改一遍?

此时,我们就遇到的困难是如何去实例化这个Adapter,这就引出了简单工厂实际模式

简单工厂模式

简单工厂设计模式,说白了就是负责实例化对象的。如果一个接口有几个实现类,我们该调用具体的哪一个实现类,这就是简单工厂负责的事情。

Mybatis源码分析_日志模块 (1)

 简单工厂、工厂、抽象工厂,在底层框架中都会被大量的使用到的。由于简单工厂实在太简单了,这里就不多说了,不了解的可以看我的 《大话设计模式》——读后感 (1)代码无错就是优?——简单工厂模式_chen_yao_kerr的博客-CSDN博客

Mybatis的日志模块巧妙整合 适配器设计模式 和 简单工厂设计模式

1.首先定义一个Log接口,这个接口规定好了具体的日志级别

2. 针对不同的日志框架,都提供一个适配器类Adapter,并且这些适配器都实现了这个接口

Mybatis源码分析_日志模块 (1)

3. 利用简单工厂,把需要被代理对象按照优先级准备好。也就是把日志框架的Adapter准备好

Mybatis源码分析_日志模块 (1)

4. 日志框架,肯定是按照优先级使用的。因此,mybatis的设计是如果已经找到了优先级中符合的日志框架Adapter,那么后面的框架都会轮空的。也就是说找到了合适的日志框架,那后面的框架就不要再new出来构造器Constructor对象了

Mybatis源码分析_日志模块 (1)

6. 最为精妙的是,这个日志的简单工厂 LogFactory 还提供了一个泛型的getLog方法。而这个方法传递了业务类的Class文件,根据适配器Adapter的构造器对象和业务对象的Class文件,去实例化当前日志框架的具体Adater对象。神来之笔。

Mybatis源码分析_日志模块 (1)

Mybatis源码分析_日志模块 (1)

 下面随处找一个Mybatis的文件,验证一下我们的观点:

Mybatis源码分析_日志模块 (1)

这样一来,即使Mybatis把整个日志框架换掉,我们调用方的代码也不需要做任何的修改。因为Log接口是我们自己定义的,每个Adapter都有对应的Adaptee。而更换日志框架,LogFactory有完整的逻辑帮我们处理,并且提供了统一的调用方法 getLog(Class<?> clazz),  客户调用方完全就不需要知道适配器(Adapter)是谁,被适配的对象(Adaptee)是谁,我也不管你改没改,我只要知道统一的Log接口,还有一个LogFactory对象就ok,完全达到了解耦的效果,简直就是神来之笔啊。

以前,我们的业务代码使用哪个日志框架,都需要引入这个框架的包路径,一旦更改日志框架,所有的地方都得改,改动数量可不会少,动不动还容易出错:

Mybatis源码分析_日志模块 (1)

 而现在,如果我们自己定义的Log接口,我管你日志框架改没改呢,我管你日志框架是每天换一个,还是每小时换一个呢,我只关注我自己的Log接口及其实现类,他们都写好了,以不变应万变,堪称完美。mybatis就是这样做的:

Mybatis源码分析_日志模块 (1)

这个设计思想,此处的代码,太值得借鉴!文章来源地址https://www.toymoban.com/news/detail-498855.html

到了这里,关于Mybatis源码分析_日志模块 (1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis源码学习之mybatis执行流程分析

    mybatis全局配置文件中涉及的标签如下图所示 下面我们来进行源码分析。 配置文件的解析创建SqlSessionFactory 配置文件的解析主要涉及到的类如下:XMLConfigBuilder、XPathParser、XPath、XNode,其中XPath、XNode是对 1、build方法内部首先会根据输入流等信息创建XMLConfigBuilder类的实例对象,

    2024年02月07日
    浏览(38)
  • MyBatis底层源码分析

    🎄欢迎来到@边境矢梦°的csdn博文🎄 🎄本文主要梳理MyBatis底层源码分析 🎄 🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下 🫰🫰🫰 ,下次更新不迷路🎆 Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕 

    2024年02月08日
    浏览(32)
  • 【Mybatis源码分析】Mybatis中的反射(MetaObject)详细讲解

    在使用Mybatis,编写DQL语句时,查询结果可能会是多个,多变量指定肯定是不现实的。而Mybatis可以进行映射,将JDBC返回的结果映射到实例类或者Map对象中,方便开发者直接使用返回对象,就可以得到从数据库取出来的结果。 映射原理大伙都知道是利用了反射(因为咱就只是通

    2023年04月08日
    浏览(62)
  • MyBatis源码分析_ResultSetHandler(7)

    目录 1. 传统JDBC 2. Mybatis访问数据库 2.1  Statement访问数据库 2.2  火枪手 ResultSetHandler 出现 3. ResultSetHandler处理结果集 3.1 首先就是进入 handleResultSets 方法 3.2 handleResultSet 方法根据映射规则(resultMap)对结果集进行转化 3.3 handleRowValuesForSimpleResultMap 方法对行进行映射处理 4.  

    2024年02月15日
    浏览(32)
  • python的日志模块学习记录

    1.导入 2.配置日志配置项(基本配置一般不能满足需要,一般使用字典配置如下) 此基础配置的日志打印格式示例 3.调用配置,是日志配置生效 4.打印日志

    2024年02月06日
    浏览(34)
  • RabbitMQ源码分析之日志系统

    作者:禅与计算机程序设计艺术 RabbitMQ是一个开源的消息队列系统,本文将从RabbitMQ服务器日志系统的设计和实现中,对其进行深入剖析。RabbitMQ服务器基于Erlang开发而成,具有高吞吐量、低延迟等优点。同时,它支持多种消息中间件协议,如AMQP、MQTT、STOMP等。本文不讨论R

    2024年02月07日
    浏览(33)
  • MyBatis-Executor源码全面分析

    MyBatis版本-5.1.3 本篇文章主要分析MyBatis中执行器与插件的相关原理与源码。再分析源码之前,需要回顾一下基础的前置知识。 1. JDBC开发回顾 1.1 JDBC代码案例 Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型

    2024年02月12日
    浏览(31)
  • 【Mybatis源码解析】mapper实例化及执行流程源码分析

    基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 基于SpringBoot的Mybatis源码解析: 1.如何对mapper实例化bean 在加载BeanDefinition时,会将SqlSessionFactory、SqlSessionTemplate、MapperScannerConfigurer加载到注册表中,以供后续进行实例化。

    2024年02月01日
    浏览(30)
  • 源码部署ELK日志分析管理系统

    日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。 通常,日志被分散在储存不同的设备上

    2024年02月09日
    浏览(33)
  • Mybatis源码分析_Mapper接口是如何实例化的 (2)

    我们在使用Spring+mybatis的时候,经常都是直接写一个接口和一个对应的 ***Mapper.xml文件,然后业务代码就可以直接注入这个接口了。它是如何做到的呢? 接口: xml    想搞清楚这个问题,那还是要从Mybatis底层源码进行分析的。Mybatis是一个非常优先的框架,它大量的将所谓的

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包