Mybatis日志模块的适配器模式详解

 更新时间:2022年08月09日 14:56:51   作者:周杰伦本人​​​​​​​  
这篇文章主要介绍了Mybatis日志模块的适配器模式详解,,mybatis用了适配器模式来兼容这些框架,适配器模式就是通过组合的方式,将需要适配的类转为使用者能够使用的接口

Mybatis的日志模块的适配器模式

我们在开发中日志是必不可少的一部分,而市场中有很多日志框架供我们使用,mybatis作为一个开源框架需要兼容这些框架,mybatis用了适配器模式来兼容这些框架,适配器模式就是通过组合的方式,将需要适配的类转为使用者能够使用的接口

下面咱们分析一下mybatis的日志模块

mybatis定义了自己的Log接口

Log接口

public interface Log {
  boolean isDebugEnabled();
  boolean isTraceEnabled();
  void error(String s, Throwable e);
  void error(String s);
  void debug(String s);
  void trace(String s);
  void warn(String s);
}

这里定义了一些常用的方法

LogFactory的静态代码块加载对应是日志适配器:

日志工厂类LogFactory

    static {
        tryImplementation(LogFactory::useSlf4jLogging);
        tryImplementation(LogFactory::useCommonsLogging);
        tryImplementation(LogFactory::useLog4J2Logging);
        tryImplementation(LogFactory::useLog4JLogging);
        tryImplementation(LogFactory::useJdkLogging);
        tryImplementation(LogFactory::useNoLogging);
    }
    private static void tryImplementation(Runnable runnable) {
        if (logConstructor == null) {
            try {
                runnable.run();
            } catch (Throwable t) {
                // ignore
            }
        }
    }
    public static synchronized void useLog4JLogging() {
        setImplementation(org.apache.ibatis.logging.log4j.Log4jImpl.class);
    }

当logConstructor用来记录日志适配器的构造方法,当logConstructor不为空的时候就不再加载其他的日志适配器了。

分析一下setImplementation()方法:

private static void setImplementation(Class<? extends Log> implClass) {
        try {
            Constructor<? extends Log> candidate = implClass.getConstructor(String.class);
            Log log = candidate.newInstance(LogFactory.class.getName());
            if (log.isDebugEnabled()) {
                log.debug("Logging initialized using '" + implClass + "' adapter.");
            }
            logConstructor = candidate;
        } catch (Throwable t) {
            throw new LogException("Error setting Log implementation.  Cause: " + t, t);
        }
    }
  • 获取适配器的构造方法
  • 然后获取这个适配器的实例,如果获取成功,把它的构造方法记录在logConstructor中,否则就会抛出异常

下面就分析一下Log4jImpl类:

Log接口的实现类

public class Log4jImpl implements Log {
  private static final String FQCN = Log4jImpl.class.getName();
  private final Logger log;
  public Log4jImpl(String clazz) {
    log = Logger.getLogger(clazz);
  }

  @Override
  public boolean isDebugEnabled() {
    return log.isDebugEnabled();
  }

  @Override
  public boolean isTraceEnabled() {
    return log.isTraceEnabled();
  }

  @Override
  public void error(String s, Throwable e) {
    log.log(FQCN, Level.ERROR, s, e);
  }

  @Override
  public void error(String s) {
    log.log(FQCN, Level.ERROR, s, null);
  }

  @Override
  public void debug(String s) {
    log.log(FQCN, Level.DEBUG, s, null);
  }

  @Override
  public void trace(String s) {
    log.log(FQCN, Level.TRACE, s, null);
  }

  @Override
  public void warn(String s) {
    log.log(FQCN, Level.WARN, s, null);
  }

}

Log4jImpl是一个适配器类,它实现了Mybatis自定义的Log接口,它的成员变量Logger是log4j里的类,我们要做的是调用Log接口的方法就可以使用log4j,Logger是需要我们适配的类,因此我们在实现Log接口的方法的时候调用Logger中的方法来完成适配,这就是适配器模式的实现

总结

Mybatis日志模块用到了适配器模式,Log接口是目标接口,Logger等各种日志框架的类是需要我们适配的类,而是适配器是Log4jImpl、Slf4jImpl等适配类

到此这篇关于Mybatis日志模块的适配器模式详解的文章就介绍到这了,更多相关Mybatis适配器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在java中判断两个浮点型(float)数据是否相等的案例

    在java中判断两个浮点型(float)数据是否相等的案例

    这篇文章主要介绍了在java中判断两个浮点型(float)数据是否相等的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • java判断字符串是否有逗号的方法

    java判断字符串是否有逗号的方法

    下面小编就为大家带来一篇java判断字符串是否有逗号的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java Swing JRadioButton单选按钮具体使用

    Java Swing JRadioButton单选按钮具体使用

    这篇文章主要介绍了Java Swing JRadioButton单选按钮具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • idea版本控制忽略.idea文件和.iml文件的问题

    idea版本控制忽略.idea文件和.iml文件的问题

    这篇文章主要介绍了idea版本控制忽略.idea文件和.iml文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • spring中的@Value读取配置文件的细节处理过程

    spring中的@Value读取配置文件的细节处理过程

    这篇文章主要介绍了spring中的@Value读取配置文件的细节处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • springboot集成普罗米修斯(Prometheus)的方法

    springboot集成普罗米修斯(Prometheus)的方法

    这篇文章主要介绍了springboot集成普罗米修斯(Prometheus)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Spring Boot实战之数据库操作的示例代码

    Spring Boot实战之数据库操作的示例代码

    本篇文章主要介绍了Spring Boot实战之数据库操作的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java中LocalDateTime的具体用法

    Java中LocalDateTime的具体用法

    本文主要介绍了Java中LocalDateTime的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java集合功能与用法实例详解

    Java集合功能与用法实例详解

    这篇文章主要介绍了Java集合功能与用法,结合实例形式详细分析了java集合的基本概念、功能、原理、操作技巧与使用注意事项,需要的朋友可以参考下
    2020-04-04
  • Java利用三目运算符比较三个数字的大小

    Java利用三目运算符比较三个数字的大小

    今天小编就为大家分享一篇关于Java利用三目运算符比较三个数字的大小,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论