【学习转载】MyBatis源码解析——日志记录
声明:转载自前辈:开心的鱼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源码解析——日志记录的更多相关文章
- myBatis源码解析-日志篇(1)
上半年在进行知识储备,下半年争取写一点好的博客来记录自己源码之路.在学习源码的路上也掌握了一些设计模式,可所谓一举两得.本次打算写Mybatis的源码解读. 准备工作 1. 下载mybatis源码 下 ...
- mybatis源码解析-日志适配器
1.为什么需要使用适配器? 集成第三方日志组件,屏蔽日志组件底层实现,统一提供写日志的接口. 2.什么是适配器模式 定义:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...
- mybatis源码-解析配置文件(三)之配置文件Configuration解析
目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...
- Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析
在上一篇文章Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例中我们谈到了properties,settings,envir ...
- mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)
目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...
- Mybatis源码解析,一步一步从浅入深(一):创建准备工程
Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...
- Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码
在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...
- Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例
在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...
- mybatis源码-解析配置文件(四)之配置文件Mapper解析
在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...
随机推荐
- 在CentOs7源码安装mysql-5.6.35单实例数据库
首先安装依赖包,避免在安装过程中出现问题 [root@bogon liuzhen]# yum -y install gcc gcc-c++[root@bogon liuzhen]# yum -y in ...
- Java 学习:对象和类
对象和类 从认识的角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的,是对对象的抽象. 从代码运行角度考虑是先有类后又对象.类是对象的模板. 对象:对象是类的一个实例,有状态和行为. 类:类是 ...
- https(ssl) 免费证书
https://letsencrypt.org/getting-started/ https://certbot.eff.org/lets-encrypt/centosrhel7-nginx http ...
- Linux档案权限篇之一
一.查看档案的属性 "ls" 第一列为档案的权限: d:代表是目录 -:代表是文件 l:代表是连接文件(相当于windows里面的快捷方式) b:代表块设备(如硬盘) c:代表字符 ...
- 二、grep文本搜索工具
grep命令作为Unix中用于文本搜索的神奇工具,能够接受正则表达式,生成各种格式的输出.除此外,它还有大量有趣的选项. # 搜索包含特定模式的文本行: [root@centos8 ~]#grep p ...
- Identity角色管理三(创建角色)
首先创建视图模型 using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Shop.Vi ...
- MySQL查询之内连接,外连接查询场景的区别与不同
前言 我在写sql查询的时候,用的最多的就是where条件查询,这种查询也叫内连查询inner join,当然还有外连查询outer join,左外连接,右外连接查询,常用在多对多关系中,那他们区别和 ...
- go新建一个工程
使用go mod 可以在任何地方新建工程 工程目录 main.go //引用子包必须格式"工程目录/子包" go.mod 子包 编译工程: go build
- CS:APP Chapter-6 存储器层次系统-读书笔记
存储器层次系统 笔记,应该不是一个大而全的文件,笔记应该是提纲挈领,是对思想的汇总浓缩,如果追求详实的内容反而是丢了初心. 计算机是抽象的,它的设计者努力让计算机变得简单,在设计上高度抽象,而计算机的 ...
- Jmeter系列(9)- Linux环境安装之安装JDK
step-1下载安装包 下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件:或者评论区留言 step-2解压到/usr/local目录 mkdir /usr/local/java ...