Mybatis 日志与设计模式

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原有系统已经从各个供应商中获取到航班数据、格式为 XML、并且将该数据传输给一个智能分析系统中做统计分析。最近业务改动、对接了一个新的智能分析系统、但是对方的输入格式为 Json、这个时候我们该怎么办?

网络异常,图片无法展示
|

网络异常,图片无法展示
|
网络异常,图片无法展示
|

原有系统已经从各个供应商中获取到航班数据、格式为 XML、并且将该数据传输给一个智能分析系统中做统计分析。最近业务改动、对接了一个新的智能分析系统、但是对方的输入格式为 Json、这个时候我们该怎么办?


我们可以创建一个适配器、该适配器实现原来的智能分析接口、在适配器里面做 XML 到 JSON 的转换、然后再真正的调用新的智能分析系统。对于应用系统而言、甚至可以不改动代码。

网络异常,图片无法展示
|


Mybatis 的适配器模式


现存主流的日志框架有 Logback、Log4j、Log4j2 等、但是大部分都是先使用 SLF4J 作为门面、通过其底层适配到具体的日志框架中。

Mybatis 中定义了自己的内部 Log 接口、然后通过适配器模式适配应用真实使用的日志框架

package org.apache.ibatis.logging;
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);
}
复制代码

Log 接口就相当于 Client Interface

Jdk14LoggingImpl 这个就相当于适配器

public class Jdk14LoggingImpl implements Log {
  private final Logger log;
  public Jdk14LoggingImpl(String clazz) {
    log = Logger.getLogger(clazz);
  }
  @Override
  public boolean isDebugEnabled() {
    return log.isLoggable(Level.FINE);
  }
  @Override
  public boolean isTraceEnabled() {
    return log.isLoggable(Level.FINER);
  }
  @Override
  public void error(String s, Throwable e) {
    log.log(Level.SEVERE, s, e);
  }
  @Override
  public void error(String s) {
    log.log(Level.SEVERE, s);
  }
  @Override
  public void debug(String s) {
    log.log(Level.FINE, s);
  }
  @Override
  public void trace(String s) {
    log.log(Level.FINER, s);
  }
  @Override
  public void warn(String s) {
    log.log(Level.WARNING, s);
  }
}
复制代码


java.util.logging.Logger 则相当于被适配的服务。

网络异常,图片无法展示
|


Mybatis 这种场景不像上面所说的供应商数据分析那种场景那么明显、因为好像 Mybatis 在项目前期就可以选择一款日志框架一样、但是并不是、它更想使用应用本身的日志框架。


或者这么说、Mybatis 自身就有了一套日志接口、面对市面上多种多样的日志框架、Mybatis 自身的接口与这些框架不兼容、而 Mybatis 更加不可能改动这些已经存在的第三方日志框架、所以它只能一个个去适配这些可能被应用使用到的框架。换这种角度、就非常适合。

网络异常,图片无法展示
|


可以看到 Mybatis 为了各种日志框架而做的各种适配器

再看看 Mybatis 如何选择出合适的适配器的

// LogFactory
  static {
    tryImplementation(LogFactory::useSlf4jLogging);
    tryImplementation(LogFactory::useCommonsLogging);
    tryImplementation(LogFactory::useLog4J2Logging);
    tryImplementation(LogFactory::useLog4JLogging);
    tryImplementation(LogFactory::useJdkLogging);
    tryImplementation(LogFactory::useNoLogging);
  }
  public static synchronized void useSlf4jLogging() {
    setImplementation(org.apache.ibatis.logging.slf4j.Slf4jImpl.class);
  }
复制代码

网络异常,图片无法展示
|

尝试去创建每种适配器、如果成功则说明了应用有使用到该日志框架、看到优先的是日志门面 LF4J


优点

  • 单一职责原则、可以将接口转换和数据转换从原有的逻辑中抽离、每个日志适配器类中、都是各个日志框架具体的调用、当然、日志的接口都是比较简单、基本都是转发接口、当然也存在其他复杂的情况
  • 开闭原则、Mybatis 只需要使用自己本来自定义的 Logger 接口即可、不需要知道具体日志框架。当然在上面的例子中甚至使用了静态工厂的方法、使应用甚至都不知道具体的适配器类或者接口的具体实现。即使以后市面上又出现另一个流行的日志框架、对于 Mybatis 来说、只是需要增加一个适配器类。(修改静态工厂这个是另外的话题、跟适配器模式没啥关系)


缺点

  • 很明显、代码复杂度高了、单纯适配器都好几个了。在这里如果直接使用某一个确定的日志框架、那么就不会存在这些适配器类了、但是这样的话、应用如果使用不同的框架、那么应用就需要配置维护两个日志框架了(当然可以使用 SL4J 再桥接过去)、这样子显然是非常不友好的。


与其他设计模式的关系

  • 桥接模式、桥接模式通常更加适用于开发前期设计、使你能够将程序的各个部分独立开来以便开发。适配器模式通常在已有的程序中使用、让相互不兼容的类能很好的合作
  • 装饰模式能在不改变对象接口的前提下强化对象的功能、并且可以递归组合、而适配器模式可以对接口进行修改(如果是新增一个新的功能、这个功能也是需要适配各种服务)、适配器模式则不能递归组合
  • 适配器能为被封装对象提供不同的接口、代理模式能为对象提供相同的接口、装饰则能为对象提供加强接口。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
39 2
|
3月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
3月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
4月前
|
SQL 监控 Java
IDEA插件-Mybatis Log Free日志替换
MyBatis Log Free 是一个免费的用于在 IntelliJ IDEA 中显示 MyBatis 日志的插件。它可以帮助您更方便地查看和分析 MyBatis 的 SQL 执行情况,以及定位潜在的性能问题,提高开发效率。
345 0
IDEA插件-Mybatis Log Free日志替换
|
4月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
5月前
|
Java 数据库连接 数据库
Spring日志完结篇,MyBatis操作数据库(入门)
Spring日志完结篇,MyBatis操作数据库(入门)
|
5月前
|
SQL Java 数据库连接
IDEA插件(MyBatis Log Free)
IDEA插件(MyBatis Log Free)
311 0
|
5月前
|
SQL Java 数据库连接
Mybatis日志SQL解析
Mybatis日志SQL解析
|
19天前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
56 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
19天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
36 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块