mybatis 日志框架的实现
一般我们如果需要指定mybatis使用的日志时都会在xml中通过setting标签进行配置,它常用的标签属性有SLF4J 、LOG4J 、 LOG4J2 、 JDK_LOGGING 、COMMONS_LOGGING 、STDOUT_LOGGING、NO_LOGGING、
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
可以发现mybatis配置的日志属性基本上都是我们常用的一些日志框架,那mybatis是如何将他们整合到一起的呢?接下来我们可以看一下源码。
找到mybatis源码中logging包的位置可以看到一个大概的目录结构,看到这个包结构,有没有很熟悉?可以看到这些其实都是mybatis内置的日志框架处理。那他们是怎么将它们整合到一起的呢?
通过看源码发现他采用了适配器的模式去整合的这些日志框架,首先它定义了一个Log接口,然后让这些日志框架实现这个接口来进行整合。
我们先分析一下log4j这个框架它是如何整合的,看Log4jImpl源码
可以看到它实现了log接口,其实我们主要查看它的构造器。可以看到它定义了一个log类成员变量。并将其赋值
public Log4jImpl(String clazz) {
log = Logger.getLogger(clazz);
}
Logger.getLogger 这个方法其实就是获取的Log4j里面的logger日志输出对象,像下面的那些debug,error这些日志输出的方法最终都是通过Log4j进行调用的。所以其实执行的是Log4j里面的方法。这样Log4jImpl就完成了对Log4j的适配。同理,我们在看一下 Slf4jImpl。
其实原理都是一样的,通过构造器去获取我们日志框架中的日志输出对象,然后再复制给类的成员变量,最终调用的方法都是调用的日志框架中的方法。这样就完成了对这个日志框架的适配,其他的实现类就由大家一起看了。那它是如何加载的呢?可以看到这里我们解析了 logimpl标签,就是在这里设置的我们具体使用的实现类。
这里其实就是解析的我们的标签然后注入对应的实现类。
在这里通过 *LogFactory.useCustomLogging 使用我们自己定义的日志框架。
获取我们设置的日志框架的构造器让后在实例化获取log对象。这样就完成了我们setting设置的日志框架的注入了。
mybatis的日志使用,主要LogFactory这个类来使用日志里面定义了,使用日志的方法。
mybatis日志框架的底层源码到这里就结束了。