设为首页 收藏本站
查看: 1312|回复: 0

[经验分享] Mybatis源码研究4:日志框架的实现

[复制链接]

尚未签到

发表于 2016-11-27 11:22:34 | 显示全部楼层 |阅读模式
  一、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.还有一个问题就是是否需要动态切换日志实现的功能,至少我觉得这个功能也是个鸡肋。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306147-1-1.html 上篇帖子: (转)基于注解的mybatis和spring整合 下篇帖子: mybatis学习demo3之添加(涉及序列)和删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表