日志是框架必不可少的一个部分,它有助于开发人员排除和发现问题。在 Mybatis 框架中,通过内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:
SLF4J
Apache Commons Logging
Log4j 2
Log4j (3.5.9 起废弃)
JDK logging
本文将分析 Mybatis 框架的日志相关源码,了解适配器模式在日志源码中的应用。先从配置说起,配置 Mybatis 日志,是通过在 mybatis-config.xml 文件里面添加一项 setting 来使用:
<configuration> <settings> ... <setting name="logImpl" value="LOG4J"/> ... </settings> </configuration>
上面所示的 value 值为:LOG4J ,这是 Mybatis 可选的几个值之一,通过源码 Configuration#205 可知所有 value 可选值,以及对应的实现类:
typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class); typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class); typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class); typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class); typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class); typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class); typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);
接着,我们继续对实现类分析,可以发现所有的实现类,都继承自 Log 接口,此接口中定义了 error 、debug 、trace 、 warn 等方法。
不同的实现类在实现这些方法时,都是调用不同的日志框架中的类方法实现。
以接口的 debug 方法为例,在实现类 Jdk14LoggingImpl.class 中,使用的是 java.util.logging 包下的 Logger 方法输出日志。
import java.util.logging.Level; import java.util.logging.Logger; public class Jdk14LoggingImpl implements Log { private final Logger log; ... @Override public void debug(String s) { log.log(Level.FINE, s); } ... }
其它实现类的套路也差不多,都是在具体实现类的 error 、debug 、trace 、 warn 方法中,去调用不同日志框架中的类,从而输出日志。
在设计模式中,这种称为适配器模式。