声明:转载自前辈:开心的鱼a1

一 .概述

MyBatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的Log级别,且各不相同,但MyBatis统一提供了trace、debug、warn、error四个级别;

自动扫描日志实现,并且第三方日志插件加载优先级如下:slf4J → commonsLoging → Log4J2 → Log4J → JdkLog;

日志的使用要优雅的嵌入到主体功能中;

二.设计模式

将各种日志组件如(slf4J ,commonsLoging ,Log4J2 , Log4J , JdkLog)统一输出,定义了trace、debug、warn、error四个级别;

日志模块类图

代理模式

三.MyBatis源码日志实现

1.MyBatis整合各方日志组件

容器启动时,按照日志组件优先级 slf4J → commonsLoging → Log4J2 → Log4J → JdkLog进行 加载,每个日志主键都做了了适配器的实现类

2.jdbc日志增强模块

 链接阶段:

实现了InvocationHandler接口是一个代理类,返回的是具有日志能力的Connection,同时打印了参数

并且调用了

PreparedStatementLogger来创建代理对象。

由此jdbc由链接阶段进入准备阶段:

PreparedStatementLogger实现了InvocationHandler接口是一个代理类,返回的是具有日志能力的ResultSet,同时打印了参数

并且调用了ResultSetLogger来创建代理对象,

由此jdbc由链接阶段进入执行阶段:

ResultSetLogger实现了InvocationHandler接口是一个代理类,返回的是具有日志能力的ResultSet,同时打印了具体的sql语句。传入参数,以及返回结果。

总结:

mybatis自身没有日志的实现通过适配器模式整合各日志厂商的日志组件,并统一了输出接口,并使用了代理模式,从链接,至编译,最后到执行阶段,进行层层代理,使日志优雅的嵌入到主体功能中;

举例:一个苹果从果树到消费者手中,果农—收购商—批发商—农贸市场—消费者,在该代理链中,消费者买苹果的价格不是某一个环节加价的,而是层层加价,同时消费者只需要在农贸市场买入苹果,而不必知道苹果如何进入农贸市场的。

对农贸市场也是如此。苹果到消费者手中共经过   收购商—批发商—农贸市场  3个代理商 ,每个代理商返回的都是加价过的代理对象,对消费者屏蔽了苹果来源。

声明:本人正在学习,喜欢收藏转载好博客,如有冒犯,提醒即删。

【学习转载】MyBatis源码解析——日志记录的更多相关文章

  1. myBatis源码解析-日志篇(1)

    上半年在进行知识储备,下半年争取写一点好的博客来记录自己源码之路.在学习源码的路上也掌握了一些设计模式,可所谓一举两得.本次打算写Mybatis的源码解读. 准备工作 1. 下载mybatis源码 下 ...

  2. mybatis源码解析-日志适配器

    1.为什么需要使用适配器?    集成第三方日志组件,屏蔽日志组件底层实现,统一提供写日志的接口. 2.什么是适配器模式 定义:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...

  3. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

  4. Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析

    在上一篇文章Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例中我们谈到了properties,settings,envir ...

  5. mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

    目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...

  6. Mybatis源码解析,一步一步从浅入深(一):创建准备工程

    Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...

  7. Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码

    在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...

  8. Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例

    在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...

  9. mybatis源码-解析配置文件(四)之配置文件Mapper解析

    在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...

随机推荐

  1. promise例题

    let promise = new Promise(resolve => { console.log('Promise'); resolve(); }); promise.then(functi ...

  2. ES6扩展——正则扩展(u、y修饰符)

    //下面三行代码效果一样 //全局匹配开头为a的 const regexp1 = /^a/g; const regexp2 = new RegExp('a','g'); const regexp3 = ...

  3. Ubuntu下 QT中配置ROS-Kinetic

    打开qtcreater自动加载ros环境,通过修改*.desktop文件 gedit ~/.local/share/applications/qtcreator.desktop 将其中Exec=XXX ...

  4. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

  5. Redis的持久化机制与内存管理机制

    1.概述 Redis的持久化机制有两种:RDB 和 AOF ,这两种机制有什么区别?正式环境应该采用哪种机制? 我们的服务器内存资源是有限的,如果内存被Redis的缓存占满了怎么办?这就要看Redis ...

  6. AOP快速入门

    一.概念 AOP面向切面编程,是函数式编程的延申,是对OOP的补充: 代理模式:拦截增强作用,增强功能: 1.java继承,纵向共性抽取, 2.横向切面AOP织入增强代码方式 二.原理是通过代理机制, ...

  7. 《微服务架构设计模式》读书笔记 | 第8章 外部API模式

    目录 前言 1. 外部API的设计难题 1.1 FTGO应用程序的服务及客户端 1.2 FTGO移动客户端API的设计难题 1.3 其他类型客户端API的设计难题与特点 2. API Gateway模 ...

  8. Python - poetry(2)命令介绍

    poetry 语法格式 poetry [-h] [-q] [-v [<...>]] [-V] [--ansi] [--no-ansi] [-n] <command> [< ...

  9. 【AGC025B】RGB Color

    [AGC025B]RGB Color 题面描述 Link to Atcoder Link to Luogu Takahashi has a tower which is divided into \( ...

  10. PHP的OpenSSL加密扩展学习(三):证书操作

    关于对称和非对称的加密操作,我们已经学习完两篇文章的内容了,接下来,我们就继续学习关于证书的生成. 生成 CSR 证书签名请求 CSR 是用于生成证书的签名请求,在 CSR 中,我们需要一些 dn 信 ...