源码:Mybatis的LogFactory生成逻辑

发现某一数据源的sql日志一直没有打印,一看configuration配置,作了

configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);

注释掉 ,就成功打印。

接下来分析源码:

public final class LogFactory {/*** Marker to be used by logging implementations that support markers.*/public static final String MARKER = "MYBATIS";private static Constructor<? extends Log> logConstructor;static {tryImplementation(LogFactory::useSlf4jLogging);tryImplementation(LogFactory::useCommonsLogging);tryImplementation(LogFactory::useLog4J2Logging);tryImplementation(LogFactory::useLog4JLogging);tryImplementation(LogFactory::useJdkLogging);tryImplementation(LogFactory::useNoLogging);}private LogFactory() {// disable construction}private static void tryImplementation(Runnable runnable) {if (logConstructor == null) {try {runnable.run();} catch (Throwable t) {// ignore}}}public static synchronized void useSlf4jLogging() {setImplementation(org.apache.ibatis.logging.slf4j.Slf4jImpl.class);}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);}}

可以看到先是获取constructor,如果获取不到,按顺序去获取其他的日志类,若已引用,则生成对应的logfactory。

configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);public void setLogImpl(Class<? extends Log> logImpl) {if (logImpl != null) {this.logImpl = logImpl;LogFactory.useCustomLogging(this.logImpl);}}public static synchronized void useCustomLogging(Class<? extends Log> clazz) {setImplementation(clazz);}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);}}

如果自己已实现类logIml的配置,则已赋值了logConstructor。

总结:mybatis若没配置自定义的日志打印类,则会顺序遍历其他的日志系统,顺序如下:

 tryImplementation(LogFactory::useSlf4jLogging);tryImplementation(LogFactory::useCommonsLogging);tryImplementation(LogFactory::useLog4J2Logging);tryImplementation(LogFactory::useLog4JLogging);tryImplementation(LogFactory::useJdkLogging);tryImplementation(LogFactory::useNoLogging);

源码:Mybatis的LogFactory生成逻辑相关推荐

  1. SharingSphere 源码解析 -- 真实SQL生成探索

    SharingSphere 源码解析 – 真实SQL生成探索 简介 在上一篇文章中,我们探索了ShardingSphere JDBC Mybatis示例执行的一个大致的过程,找到了SQL处理的关键节点 ...

  2. WoShop多商户进口出口跨境电商uniapp商城源码,多语言翻译逻辑

    WoShop多商户进口出口跨境电商uniapp商城源码,多语言翻译逻辑(含国际支付.国际物流,APP+H5) 我觉得WoShop商城系统与市面上绝大部分的源码商相比,最大的区别在于,我们足够期待你的成 ...

  3. 【小程序源码】llz制作生成装逼工具支持小程序和公众号制作生成

    这是一款制作生成小工具 支持小程序主图制作生成 也支持公众号的llz制作生成 每一种制作都包含了所有的模式 用户自己填写选择制作就可以了! 好了下面来看看小编的测试演示图吧! 小程序源码下载地址:[小 ...

  4. 【源码篇】聊聊源码mybatis(更新分析)

    文章目录 1.举个case-向数据库插入单个实体对象 2.核心类和核心方法 2.1.Part1​[解析]:zap:解析Mapper接口.@Insert注解和其他入参. 2.1.1.MapperProx ...

  5. c++map的使用_mybatis源码 | mybatis插件及动态代理的使用

    学习背景 最近公司在做一些数据库安全方面的事情,如数据库中不能存手机号明文,不能存身份证号明文, 但是项目已经进行了好几个月了, 这时候在应用层面去改显然不太现实, 所以就有了Mybatis的自定义插 ...

  6. 我的世界java刷怪数量_我的世界Minecraft源码分析(1):刷怪逻辑

    这个系列通过对我的世界Minecraft源码进行拆分讲解,让大家可以清除的了解一款游戏是怎么一步步被实现出来的,下面就介绍Minecraft源码第一篇内容,关于刷怪逻辑. 生成循环 生物大致划分为四种 ...

  7. vue - element <upload> 组件批量上传文档,可携带其他表单数据项一同与文件 “手动提交“ 服务器(类似百度文库系统批量上传前端界面与逻辑)超详细教程示例源码,提供界面与逻辑完整源码

    效果图 本示例使用的是 element 组件库,其实什么组件库都行(逻辑是一样),只要你是 vue.js 项目就能使用本教程. 本文实现了 vue + element 使用 upload 组件批量上传 ...

  8. postgresql snapshot快照源码解析, 快照内容生成规则, 可见性是这样判断的

    postgresql snapshot快照源码解读 ​专栏内容:postgresql内核源码分析 个人主页:我的主页 座右铭:天行健,君子以自强不息:地势坤,君子以厚德载物. 概述 本文主要介绍数据库 ...

  9. Android-黄油刀ButterKnife依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

    基本环境搭建(auto&javapoet) 一.API采取背景,举例 主要为了解决客户端MVP架构中,V层和P层生命周期不同步时,生成空View保护性逻辑. 之前需要手写空View的代码,现在 ...

  10. Flink 源码解析2--JobGraph的生成

    上一节介绍了StreamGraph的生成,这个实际上只对应 Flink 作业在逻辑上的执行计划图.Flink 会进一步对 StreamGraph 进行转换,得到另一个执行计划图,即JobGraph.然 ...

最新文章

  1. 输出程序运行的时间(精确到微秒)
  2. 用跑得最慢的电脑程序,理解最高深的哥德巴赫猜想
  3. jq输出文本_jQuery获取文本节点之 text()/val()/html() 方法区别
  4. python---微信聊天机器人
  5. Spring Boot - 自动装配中的不可忽视的@Import
  6. DA14580做主机
  7. 在没有网的windows环境下安装Python模块
  8. weex 打包apk
  9. javap(反汇编命令)详解
  10. poj 1201 差分约束
  11. 应用数学软件测试题,高等数学第六章定积分应用综合测试题
  12. python中代理模式分为几种_Python设计模式之代理模式实例详解
  13. USACO section1.3 Barn Repair 修理牛棚(贪心)
  14. 2台电脑一根网线传文件_用1根网线直连2台电脑,能干嘛?
  15. 地籍图 cad cass 二次开发 过滤器过滤扩展数据组码1000的解决方案
  16. 安卓apk反编译教程
  17. Android 自定义View实现照片裁剪框与照片裁剪
  18. 【java】JavaFX从零开始实现拼图小游戏
  19. Improving Entity Linking by Modeling Latent Relations between Mentions
  20. V-token的技术革新,引领数字化支付热潮

热门文章

  1. php cms下载地址,让PHPCMS下载内容页显示链接真实地址
  2. eclipse离线搭建maven项目,配置本地仓库,并创建mybatis项目
  3. 计算机基础笔记(摘录)
  4. MATLAB:图像半调转换(halftone)和抖动转换(dither)
  5. 【金融财经】金融市场一周简报(2017-09-15)
  6. 网络字节序与主机字节序的转换 - HEN_MAN的专栏 - 博客频道 - CSDN.NET
  7. 群晖nas介绍文档_我的NAS我的地盘 篇三:群晖NAS软件介绍与应用之DS file篇
  8. 中国移动发狠,给携转用户巨额优惠,反击中国电信
  9. C# 之 概率随机数
  10. 华为云SSL证书申请流程