Mybatis日志模块的适配器模式详解
作者:周杰伦本人??????? 时间:2023-11-26 12:45:32
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中的方法来完成适配,这就是适配器模式的实现
来源:https://blog.51cto.com/u_15460453/5557138
标签:Mybatis,日志,模块,适配器,模式
0
投稿
猜你喜欢
Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法
2021-07-26 11:57:46
Java实现二叉搜索树的插入、删除功能
2023-07-15 20:54:53
Java中的强引用,软引用,弱引用,虚引用的作用介绍
2023-08-27 11:03:28
Android ExpandableListView单选以及多选实现代码
2023-01-14 20:45:51
实战SpringBoot集成JWT实现token验证
2022-10-07 15:57:49
Java实现Andriod带看括弧的计算器代码
2023-04-06 09:36:00
PageHelper插件实现一对多查询时的分页问题
2021-11-05 07:02:34
java final 和instanceof 关键字的区别
2021-11-03 13:52:43
java substring 截取字符串的方法
2023-02-12 17:21:19
Java实现五子棋(附详细源码)
2023-10-19 15:20:54
SpringBoot打jar包遇到的xml文件丢失的解决方案
2023-04-11 23:39:06
iOS WebView中使用webp格式图片的方法
2023-06-17 22:06:03
Java实现单例模式之饿汉式、懒汉式、枚举式
2022-12-17 17:50:13
Springboot中如何使用Jackson
2021-07-29 03:27:34
IntelliJ IDEA 常用设置(配置)吐血整理(首次安装必需)
2021-06-24 15:23:49
SpringBoot整合Xxl-Job的完整步骤记录
2021-08-08 20:47:16
Android实现蒙版弹出框效果
2023-06-14 17:13:43
IDEA导入外部项目报Error:java: 无效的目标发行版: 11的解决方法
2021-08-25 03:02:27
Java中对list map根据map某个key值进行排序的方法
2023-09-04 17:10:03
Spring拦截器HandlerInterceptor接口代码解析
2022-09-05 10:51:04