MyBatis源码解析之日志记录

  

一。概述

  

MyBatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的日志级别,且各不相同,但MyBatis统一提供了跟踪、调试、警告、错误四个级别;

  

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

  

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

  

二。设计模式
 MyBatis源码解析之日志记录”> <br/>将各种日志组件如(slf4J、commonsLoging Log4J2, Log4J, JdkLog)统一输出,定义了跟踪、调试、警告、错误四个级别;<br/>日志模块类图<br/> <img src=

  

 MyBatis源码解析之日志记录”> <br/>容器启动时,按照日志组件优先级slf4J→commonsLoging→Log4J2→Log4J→JdkLog进行加载,每个日志主键都做了了适配器的实现类<br/> <img src=

  

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

  

总结:   

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

  

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

  

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

MyBatis源码解析之日志记录