适配器模式相关源码:slf4j-1.6.1、hibernate-3.6.7
大家都知道,log4j是一个广泛使用的日志工具,除此之外,sun公司在JDK中也有自己的日志工具,也就是java.util.logging.Logger。当然还有其他一些日志工具。
多种日志工具功能和使用方式类似,一般都包含debug、info、warn、error等日志级别的方法,但却没有实现共同的接口。这一点不像JDBC,虽然关系型数据库种类很多,例如MySQL、Oracle等,但是有一套统一的接口,也就是JDBC。
当然,如果你自己写一个项目,只要随便找一个日志工具用就行。但是,一些开源框架的作者就比较纠结了,他不知道你的系统用的是哪种日志工具,就不知道他在开源框架中使用哪一个日志工具。
slf4j提供了一个共同的接口,并实现了不同日志工具的适配器。所以开源框架中日志只需要调用slf4j提供的接口就行,不需要关心到底是用的哪个实现类。例如ORM框架Hibernate的日志就依赖slf4j。
和slf4j类似的还有commons-logging等。
源码(由于源码巨长,所以下面省略无关代码):
slf4j提供统一的接口org.slf4j.Logger,该接口提供给客户端(如Hibernate)去调用:
package org.slf4j;
public interface Logger {
public boolean isTraceEnabled();
public void trace(String msg);
public void trace(String format, Object arg);
public void trace(String format, Object arg1, Object arg2);
public void trace(String format, Object[] argArray);
public void trace(String msg, Throwable t);
public boolean isDebugEnabled();
public void debug(String msg);
public void debug(String format, Object arg);
public void debug(String format, Object arg1, Object arg2);
public void debug(String format, Object[] argArray);
public void debug(String msg, Throwable t);
public boolean isInfoEnabled();
public void info(Str