游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

写给大忙人看的,MyBatis日志如何做到兼容常用的日志框架

  前言
  日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但是日志还有其他很多优秀的框架,比如:ApacheCommonLog,Log4j,java。util。logging等。MyBatis作为一款优秀的ORM框架,定义了一套统一的日志接口供应用层调用,而底层却利用适配器模式兼容了我们上面所列出来的常用日志框架。MyBatis日志分类
  在介绍MyBatis的全局配置文件的时候,我们提到setting内有一个属性logImpl,可以配置的选项有:SLF4J,LOG4J,LOG4J2,JDKLOGGING,COMMONSLOGGING,STDOUTLOGGING,NOLOGGING。
  这就说明MyBatis支持六种日志类型(NOLOGGING是不打印日志)。我们看一下MyBatis的日志模块也可以很明显的看出六种日志类型:
  它们的对应关系为:
  PS:需要注意的是,SLF4J并不是一个具体的日志框架,也就是我们不能单独只配置SLF4J而不引入其他任何具体的日志框架。简单谈谈SLF4J
  SLF4J:简单日记门面。(英文全称为simpleloggingFacadeforJava),这个是用来为各种日志框架提供一个简单的统一的接口,这样使得我们在切换日志框架的时候可以直接替换jar包就可以了,而无需修改源代码。
  logback我想大家都用过,logback是一个实现了具体日志打印的框架,但是MyBatis上面列出来的分类并没有支持logback,它又为什么能够打印呢?这就是SLF4J的作用了,因为logback也实现了SLF4J提供的接口,所以我们需要将logback和SLF4J结合配置使用才行。而后面的介绍中也可以看到,MyBatis中如果我们不指定日志种类的时候,优先选择的就是SLF4J,这正是因为SLF4J可以和其他许多日志框架一起结合来使用。
  那么假如我们指定了日志类型为SLF4J,但是不引入其他任何实现呢?
  答案就是MyBatis不会打印任何日志出来,下图就是只配置了SLF4J而没有引入其他任何实现的警告信息:
  可以看到这里提示我们SLF4J没有任何实现,而后面的sql语句和参数这些信息也没有打印出来。MyBatis日志实现原理日志的解析
  老规矩,我们还是先找到加载mybatisconfig配置文件中的解析日志的源码:
  这里首先会根据我们配置的属性作为别名去TypeAliasRegistry类中查找对应的类,如果不存在这个别名,那就会把我们配置的属性直接通过Class。forName去查找日志类,所以看到这里就明白我们可以自定义日志类,只要实现Log接口就行,然后配置我们自己的类名就行了。虽然别名都存在TypeAliasRegistry类里面,但是我们前面介绍MyBatis配置文件的时候,列出了TypeAliasRegistry类中默认初始化的别名,并没有看到日志相关类的别名,那么日志的别名又是在哪里配置的呢?我们打开Configuration类:
  可以看到Configuration的构造方法里面也初始化了一些别名注册到TypeAliasRegistry类了。
  接下来我们看看读取到日志类之后调用了setLogImpl做了什么事情:
  调用了LogFactory类的方法。LogFactory
  LogFactory工厂是负责创建日志对象对应的适配器。
  LogFactory的静态代码块内按顺序初始化了所有内置的日志
  再看一下tryImplementation方法,如果logConstructor不为空,说明当前还没有加载到日志适配器,那就继续执行run()方法,也就是继续执行useXXXLogging方法,而所有的useXXXLogging方法都是调用了setImplementation方法。
  下面这里如果加载成功之后就会对logConstructor进行赋值,那么后续的方法就不会再执行run()方法,而如果抛出异常,因为已经被捕获了,所以就会继续往后执行静态代码块内的方法。
  从上面的LogFactory中我们可以看到,初始化的时候就会默认初始化一个日志适配器,所以如果我们引用了相关日志所需要的类,那么就会按照static代码块内的顺序进行选择一个合适的日志适配器。
  继续回到上面的Configuration里面,这里拿到我们配置的日志信息之后,会直接调用useCustomLogging方法,也就是绕过了上面的logConstructornull这个判断,而直接调用了setImplementation方法,所以假如我们配置了日志信息,那么会覆盖初始化的日志适配器。
  PS:假如我们配置了一个不存在的日志类,那么调用setImplementation方法的时候异常就会被抛出来,因为捕获异常的方法是在tryImplementation而不是在setImplementation。jdbclog
  MyBatis的日志包下面还有一个包时jdbc,这个我们还没有介绍,那么jdbc包下面的类又有什么用呢?我们先看一下类图关系:
  很明显,MyBatis将日志拆分成了ConnectionLogger,PreparedStatementLogger,ResultSetLogger,StatementLogger四种类型分开处理,它们都继承了BaseJdbcLogger类,而且实现了InvocationHandler接口,也很明显,这里用到了JDK动态代理。
  任意点开ConnectionLogger可以发现,它是用来代理Connection对象的:
  其他三个那很明显,分别是用来代理PreparedStatement,ResultSet,Statement这三个对象的。也就是说MyBatis中日志最终的打印是通过JDK动态代理来实现的,而且不同的执行过程分成了四个对象来分别负责对应的日志打印。
  我们继续看一下ConnectionLogger的invoke方法,可以看到,这里就是打印了一句日志:
  上面日志打印出来的效果就是我们下面红框中的日志:
  等等,差点被忽悠了,这代码里面并没有打印,打印出来的这个符号又是怎么来的呢?
  那就需要进入debug方法里面继续看一看,这个debug方法是在抽象类BaseJdbcLogger里面实现的,所以我们还需要看看BaseJdbcLogger类的debug方法。
  可以看到这里打印的时候拼接了一个前缀:
  PS:queryStack是查询层数,如果没有嵌套查询则queryStack1总结
  本文主要分析了MyBatis日志的加载原理,并对LogFactory作为适配器对象工厂是如何选择日志适配器对象进行了分析。最后分析了MyBatis是如何通过动态代理将不同日志类型分为不同对象来实现日志打印功能的。

互联网新基建,智慧工地唤醒千亿市场?智慧工地解决方案兼顾施工方与监管单位的双向诉求,是解决当前工地管理难题的最佳方案,也是建筑行业互联网发展趋势。智慧工地立足打造新一代的施工企业,通过智慧工地系统的先进技术……征服,竞释威5!华硕四款X570新主板降临征服,竞释威5!华硕四款X570全新主板重磅来袭!ROGCROSSHAIRVIIIEXTREMEProArtX570CREATORWIFIROGSTRI……精英律师罗槟最后和戴曦在一起了吗精英律师罗槟的扮演者是谁近日,电视剧《精英律师》已经开播了,开播以来就好评不断,罗槟和戴曦的关系也很受大家的关注,那么,在这部剧的最后,罗槟和戴曦走在一起了吗?精英律师罗槟的扮演者是谁?一起来看一下。……封神榜神位大小排名封神榜中封神的神位都有谁《封神演义》一般俗称《封神榜》,又名《商周列国全传》、《武王伐纣外史》、《封神传》,是明代许仲琳创作的长篇小说,封神榜柏鉴封的神位最高,柏鉴是《封神演义》中的角色,主管接引魂魄……老友记开播25周年什么情况老友记那些主演们你都还记得吗今天是老友记开播的25周年,老友们都在发文感慨ldquo;宛若昨日rdquo;,不少网友表示,时隔25年还是宛若昨天,具体什么情况,一起来看一下。9月22日是《老友记》开……Springboot管理系统,架构简单易懂,二次开发便捷关注转发之后私信回复【源码】即可免费获取本项目源代码1、由Java编写的后台管理系统,架构简单易懂,二次开发非常简单,初学者上手更容易2、目前有很多类似的后台框架,个人使用后还……张近东员工激励是约束,也是企业发展的源泉近日,苏宁开启今年第二次大幅度加薪工作,领跑行业年底加薪潮。在今年的特殊背景下,苏宁两次大规模逆势加薪、持续向中基层员工下沉的股权激励,以及即将继续加码的五险一金福利,既是张近……银弹谷传统企业数字化转型需要经过几个阶段?随着智能制造,万物互联的概念逐渐火热,许多传统企业都在寻找数字化转型的道路,那么从理论上来说,传统企业数字化转型需要经过几个阶段?通常认为传统企业数字化转型要经历三个阶段……AMD锐龙75800H处理器加持华硕无畏Pro14实力全开超4月20日,在2021年红点大奖上华硕一举斩获了37项产品设计奖,刷新了评选中获得红点奖新纪录。该奖项着重考察产品设计的创新性及卓越程度,致力于推动产品设计为用户提供超乎想象的……树人格鲁特是一个怪胎吗,树人格鲁特身世揭晓树人格鲁特:是一个怪胎吗,树人格鲁特身世揭晓银河护卫队树人格鲁特身世科普:曾经被认为是一个怪胎。格鲁特星球充满了暴力,压根没有真善美在格鲁特出生的星球上,有好多好多……张钧甯苦练文言文为清宫剧如懿传更贴近角色张钧甯苦练文言文:为清宫剧《如懿传》更贴近角色汪俊导演,张钧甯搭档周迅、霍建华等人主演的清宫剧《如懿传》开播,张钧甯饰演的珂里叶特middot;海兰,虽性格温婉,骨子里却……如何最短时间通过阿里P5P8的Java面试?话不多说,直接开始!这份PDF面经知识点包括了五个大部分,26个知识点:Java部分:Java基础,集合,并发,多线程,JVM,设计模式数据结构算法:Java算法,数据结构开源……
向日葵智能插线板P2评测远程控制便捷操作,1个插线板就够了今年很多人都不得已在家远程办公,但是在家办公最大的难点就是公司电脑和家里电脑资料不同步,如果要回家或者到公司同步资料,来来回回浪费时间,非常影响工作效率。但是科科最近发现……入秋的第一场雪,下的好大!25号,边城黑河下了入秋以来的第一场大雪。从凌晨开始,纷纷扬扬,潇潇洒洒,下了小半天。由于天气还不算冷,这使得道路有些湿滑,特别是到了晚上,温度降低,路面结冰,给出行带来了一些……iOS15。1正式版体验分享,更新之前不如先进来看看iOS15。1正式版体验分享今天凌晨苹果推送了iOS15。1正式版系统。本次更新内容和修复的问题都比较多。有FaceTime上的同播共享功能、iPhone13系列的自动微……电影史前超人热播中许多观众GET到感动G点电影《史前超人》正在爱奇艺平台热播中。这部历时一年后期制作的玄幻动作喜剧大片由关尔执导。青春校园网络剧《龙日一,你死定了》中的女一号张静美的扮演者、新生代人气偶像侯佩杉出演本片……甄嬛熬成了太后,但依旧是树欲静而风不止,只是另一个故事的开始甄嬛传的剧情经典,值得反复看,反复推敲,甄嬛传里面乾隆四阿哥的身世沿用了民间的传说版本,就是乾隆的生母,到底是谁,虽然剧中肯定了乾隆是雍正的孩子,但是也确定了乾隆不是甄嬛太后的……电影史前超人明日爱奇艺独播新二次元主义来袭电影《史前超人》3月27日即明日下午四点将在爱奇艺VIP会员独播,片方今日发布了倒计时1天的横幅海报。这部历时一年后期制作的玄幻动作喜剧大片由北京泽西、中视时代等公司联合出品,……情人节里,超过2。4亿人在吃单身狗粮掐指一算,又是一年一度的七夕了。恰逢周六,这天时地利人和的,朋友圈又该出现不少精彩的狗粮了。转账、礼物、牵手、凡尔赛、聊天记录、贴脸自拍佳佳真心认为咱们庞大的……不必吐籽畅快吃的突尼斯石榴,该去哪里买?俗话说:七月鲜桃八月梨,九月柿子红了皮,秋天的石榴咧嘴笑,大红鲜枣最便宜。如今到了秋天,刚好是石榴咧嘴笑的时候,看着那红如玛瑙、白似水晶的石榴,怎么不让人垂涎欲滴呢?石榴虽然好……电影史前超人曝超人武器版海报电光剑首次亮相距离电影《史前超人》3月27日登陆爱奇艺独播只剩下短短的七天时间了!这部历时一年后期制作的玄幻动作喜剧大片由关尔执导。青春校园网络剧《龙日一,你死定了》中的女一号张静美的扮演者……环太平洋雷霆再起曝怪兽横行特辑海报怪兽独门武器毁天灭地由美国传奇影业、美国环球影业和善为影业联合出品的好莱坞科幻动作巨制《环太平洋:雷霆再起》发布了怪兽横行版特辑与海报。身为超级怪兽片粉丝的导演斯蒂文S迪奈特,为观众带来了全新升级……狂暴巨兽发布硬汉暴击版预告戏精硬汉强森遇巨兽狂奔保小命?由《末日崩塌》导演布拉德佩顿执导,巨石强森实力演绎的好莱坞怪兽灾难巨制《狂暴巨兽》曝硬汉暴击版预告。此次预告主题为人类vs巨兽,以巨石强森为首的人类,与基因被改变的凶猛巨兽形成……环太平洋雷霆再起曝怪兽横行特辑海报怪兽独门武器毁天灭地由美国传奇影业、美国环球影业和善为影业联合出品的好莱坞科幻动作巨制《环太平洋:雷霆再起》发布了怪兽横行版特辑与海报。身为超级怪兽片粉丝的导演斯蒂文S迪奈特,为观众带来了全新升级……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网