评论

收藏

[Java] MyBatis源码分析之日志记录详解

编程语言 编程语言 发布于:2021-10-07 15:10 | 阅读数:299 | 评论:0

这篇文章主要给大家介绍了关于MyBatis源码分析之日志记录的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一 .概述
mybatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的log级别,且各不相同,但mybatis统一提供了trace、debug、warn、error四个级别;
自动扫描日志实现,并且第三方日志插件加载优先级如下:slf4j → commonsloging → log4j2 → log4j → jdklog;
日志的使用要优雅的嵌入到主体功能中;
二.设计模式
DSC0000.jpg

将各种日志组件如(slf4j ,commonsloging ,log4j2 , log4j , jdklog)统一输出,定义了trace、debug、warn、error四个级别;
日志模块类图
DSC0001.jpg

代理模式
DSC0002.jpg

DSC0003.jpg

DSC0004.jpg

三.mybatis源码日志实现
1.mybatis整合各方日志组件
DSC0005.jpg

DSC0006.jpg

容器启动时,按照日志组件优先级 slf4j → commonsloging → log4j2 → log4j → jdklog进行 加载,每个日志主键都做了了适配器的实现类
DSC0007.jpg

2.jdbc日志增强模块
DSC0008.jpg

DSC0009.jpg

链接阶段:
DSC00010.jpg

DSC00011.jpg

实现了invocationhandler接口是一个代理类,返回的是具有日志能力的connection,同时打印了参数
DSC00012.jpg

并且调用了
DSC00013.jpg

preparedstatementlogger来创建代理对象。
由此jdbc由链接阶段进入准备阶段:
DSC00014.jpg

preparedstatementlogger实现了invocationhandler接口是一个代理类,返回的是具有日志能力的resultset,同时打印了参数
并且调用了resultsetlogger来创建代理对象,
由此jdbc由链接阶段进入执行阶段:
DSC00015.jpg

DSC00016.jpg

resultsetlogger实现了invocationhandler接口是一个代理类,返回的是具有日志能力的resultset,同时打印了具体的sql语句。传入参数,以及返回结果。
总结:
mybatis自身没有日志的实现通过适配器模式整合各日志厂商的日志组件,并统一了输出接口,并使用了代理模式,从链接,至编译,最后到执行阶段,进行层层代理,使日志优雅的嵌入到主体功能中;
举例:一个苹果从果树到消费者手中,果农—收购商—批发商—农贸市场—消费者,在该代理链中,消费者买苹果的价格不是某一个环节加价的,而是层层加价,同时消费者只需要在农贸市场买入苹果,而不必知道苹果如何进入农贸市场的。
对农贸市场也是如此。苹果到消费者手中共经过 收购商—批发商—农贸市场 3个代理商 ,每个代理商返回的都是加价过的代理对象,对消费者屏蔽了苹果来源。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对CodeAE代码之家的支持。
原文链接:https://www.cnblogs.com/dw-haung/p/9942810.html

关注下面的标签,发现更多相似文章