Mybatis 源码-日志

日志模块结构

  • Log4j2也是类似的结构,jdk14、nologging、stdout和commons则没有委派

  • JDBC日志模块则使用了代理模式

mybatis 日志模块包结构

mybatis 没有自己的日志实现类,而是通过接入第三方日志组件,采用适配器模式代理模式,屏蔽第三方日志组件差异,提供四种日志级别,并自动扫描日志实现。

Log 接口

首先定义了一个目标接口 Log,其下定义有多个日志级别抽象方法

日志工厂类 LogFactory

用于生产和获取具体日志类,内部持有 Log 接口的构造器,然后在静态代码块中定义了第三方日志组件的加载优先级

静态代码块中的 tryImplementation() 方法:如果 LogFactory 持有的 Log 构造器对象 logConstructor 是空的,才会加载,进入 setImplementation() 生产出对应的日志组件,并赋值给 logConstructor

只要 logConstructor 被赋值不为空了,就不会加载静态代码块中后面的日志组件

适配 Slf4j 日志组件

目标接口:Log

两个适配者:Logger、LocationAwareLogger

适配器:Slf4Impl

这里根据版本不同,委派给不同的类(Slf4jLoggerImpl、Slf4jLocationAwareLoggerImpl)去适配

你可能感兴趣的:(Mybatis 源码-日志)