博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis源码研究4:日志框架的实现
阅读量:5924 次
发布时间:2019-06-19

本文共 1916 字,大约阅读时间需要 6 分钟。

hot3.png

 一、logging包的概述

本包主要依赖了 Mybatis的reflection包的ExceptionUtil和io包的Resources, 以及第三方的Log4j,Slf4j,CommonsLogging。

 
  Mybatis的其它包大量引用了本包中的类和接口,即严重依赖于本包。
 
 
  从Mybatis自身的包和类来看,logging包对其它包仅有少量的依赖,而其它很多包却对logging包有大量的依赖。

  因此,先从logging包讲起。先易后难是制胜之道。
 
 

二、日志框架核心类和接口

 Log接口定义了4种日志级别,
 
 void error(String s);

 void debug(String s);

 void trace(String s);

 void warn(String s);

 
 LogFactory工厂类生成Log接口,准确地说,是生成Log接口的实现。
 
 LogException定义了 日志异常,运行时异常。
 
 
三、日志的7种实现

 

 把日志抽象成Log接口,该接口有7种实现。

  1.Apache Commons Logging
  2.JDBC Logging
  3.Java Util Logging
  4.Log4j
  5.No Logging
  6.Slf4J
  7.Stdout
 
 7种实现分别位于logging包的7个子包中:commons,jdbc,jdk14,log4j,nologging,slf4j,stdout。
 
 
 1.commons包下的JakartaCommonsLoggingImpl使用Apache Commons Logging包实现了Log接口。
 
 2.jdbc包下的类 并没有直接实现Log接口,而是将Log接口作为自身的一个属性。
 
 BaseJdbcLogger:代理类的父类,代理类增加了logging功能。
 
 ConnectionLogger, PreparedStatementLogger, ResultSetLogger,StatementLogger都继承了BaseJdbcLogger,
 实现了InvocationHandler 接口。
 
 ConnectionLogger:Connection的代理类,增加了日志功能。
 
 PreparedStatementLogger:PreparedStatement的代理类,增加了日志功能。
 
 ResultSetLogger:ResultSet的代理类,增加了日志功能。
 
 StatementLogger:Statement的代理类,增加了日志功能。
 
 
 
 3.jdk14包下的Jdk14LoggingImpl 使用java.util.logging.Logger和java.util.logging.Level 2个类实现了Log接口。
 
 4.log4j包下的Log4jImpl 使用 Log4J包实现了 Log接口。
 
 5.nologging包下的NoLoggingImpl 空实现了 Log接口,即Log接口的实现方法没有意义,或者没有任何代码。
 
 6.slf4j包下的Slf4jImpl,Slf4jLocationAwareLoggerImpl,Slf4jLoggerImpl 都使用Slf4J包 实现了 Log接口。
 
 7.stdout包下的StdOutImpl使用 System.err.println(s)和System.out.println(s) 实现了Log接口。
 
 
 
 四、日志工厂

 日志工厂类:LogFactory,提供日志接口的实现。
 
 在静态代码块中 加载所有的log实现类,
 mybatis会按以下顺序依次找有没有这个日志类,找到就用这个日志

SLF4J->Apache Commons Logging->Log4J->JDK logging->No Logging

 

获取Log接口的实现类的方法。

public static Log getLog(Class<?> aClass);

public static Log getLog(String logger) ;

五、值得探讨的几个问题:

在这个工厂类里我们可以非常容易地感觉到“坏味道”:

 
  1.在catch块中什么都不做,这是应该尽量避免出现的情况。
 
  2.在static块中会尝试依次加载所有的log实现类,这点也是值得商榷的。
 
  3.因为在一个系统中一般只使用一种日志实现,一次性加载所有的实现只会带来性能问题;
 
  4.还有一个问题就是是否需要动态切换日志实现的功能,至少我觉得这个功能也是个鸡肋。

转载于:https://my.oschina.net/jiutianniao/blog/399578

你可能感兴趣的文章
循序渐进地代码重构
查看>>
JavaScript基础知识十六(原型链模式-继承)
查看>>
简介HTTP协议及及应用
查看>>
如何减少测试提的bug
查看>>
.html与.text的异同
查看>>
C#异步语法糖的苦与甜
查看>>
初识面向过程与面向对象
查看>>
使用selenium遇到java.lang.NoSuchMethodError: org.apache.xpath.XPathContext,排查
查看>>
iOS多线程开发之GCD(死锁篇)
查看>>
三种软件的特点分析
查看>>
webug4.0储存型xss-10
查看>>
Ubuntu14.04配置gcc4.4.4+Qt4.8.4交叉编译环境
查看>>
2802:小游戏
查看>>
程序员英语二三事(1)
查看>>
new、override关键字
查看>>
java总结
查看>>
iphone开发之解决viewWillAppear失效
查看>>
Activity 事件以及如何得到新打开Activity关闭后返回的数据
查看>>
word标题前出现黑块解决方案
查看>>
python中的正则表达式
查看>>