日志模块结构
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)去适配