范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  前言
  日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但是日志还有其他很多优秀的框架,比如:Apache Common Log,Log4j,java.util.logging等。MyBatis作为一款优秀的ORM框架,定义了一套统一的日志接口供应用层调用,而底层却利用 适配器模式 兼容了我们上面所列出来的常用日志框架。 MyBatis日志分类
  在介绍MyBatis的全局配置文件的时候,我们提到setting内有一个属性logImpl,可以配置的选项有:SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING。
  这就说明MyBatis支持六种日志类型(NO_LOGGING是不打印日志)。我们看一下MyBatis的日志模块也可以很明显的看出六种日志类型:
  它们的对应关系为:
  PS:需要注意的是,SLF4J并不是一个具体的日志框架,也就是我们不能单独只配置SLF4J而不引入其他任何具体的日志框架。 简单谈谈SLF4J
  SLF4J:简单日记门面。(英文全称为simple logging Facade for Java),这个是用来为各种日志框架提供一个简单的统一的接口,这样使得我们在切换日志框架的时候可以直接替换jar包就可以了,而无需修改源代码。
  logback我想大家都用过,logback是一个实现了具体日志打印的框架,但是MyBatis上面列出来的分类并没有支持logback,它又为什么能够打印呢?这就是SLF4J的作用了,因为logback也实现了SLF4J提供的接口,所以我们需要将logback和SLF4J结合配置使用才行。而后面的介绍中也可以看到,MyBatis中如果我们不指定日志种类的时候,优先选择的就是SLF4J,这正是因为SLF4J可以和其他许多日志框架一起结合来使用。
  那么假如我们指定了日志类型为SLF4J,但是不引入其他任何实现呢?
  答案就是MyBatis不会打印任何日志出来,下图就是只配置了SLF4J而没有引入其他任何实现的警告信息:
  可以看到这里提示我们SLF4J没有任何实现,而后面的sql语句和参数这些信息也没有打印出来。 MyBatis日志实现原理 日志的解析
  老规矩,我们还是先找到加载mybatis-config配置文件中的解析日志的源码:
  这里首先会根据我们配置的属性作为别名去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方法,也就是绕过了上面的logConstructor == null这个判断,而直接调用了setImplementation方法,所以假如我们配置了日志信息,那么会覆盖初始化的日志适配器。
  PS:假如我们配置了一个不存在的日志类,那么调用setImplementation方法的时候异常就会被抛出来,因为捕获异常的方法是在tryImplementation而不是在setImplementation。 jdbc log
  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是查询层数,如果没有嵌套查询则queryStack=1 总结
  本文主要分析了MyBatis日志的加载原理,并对LogFactory作为适配器对象工厂是如何选择日志适配器对象进行了分析。最后分析了MyBatis是如何通过动态代理将不同日志类型分为不同对象来实现日志打印功能的。

冰糖橙重新站上六万美元等等党这次如何应对?就在刚刚不久,虚拟货币里的头号角色冰糖橙价格重新站上了阔别数月的6万美元,以目前的趋势来看,虚拟货币的走势可以说是出乎很多人的意料。要知道,就在半个月前,我们出台了史上最严的虚拟货国行价35999元,尼康年度真机王Z9无反相机正式发布视频加载中对于尼康粉丝来说,过去三年多来可能是有点折磨的,重新构建镜头群Z6Z7第一代单XQDCFX卡槽设计Z6IIZ7II视频能力诟病拍视频RAW需要外录机,尼康曾经的强项对焦和罗永浩赚直播的钱,圆科技的梦赚直播的钱,圆科技的梦。这句话用来形容罗永浩再贴切不过了。近日,罗永浩在接受媒体采访时表示,如果有一天债务还完了,我还是想做一个软硬件结合的智能设备,一个平台级的东西,而不是一个相始于颜值忠于品质!全新宝马7系渲染图曝光,有望2022年亮相近日,我们从相关渠道获悉了一组全新宝马7系(参数询价)的渲染图,说起宝马这个品牌,相信很多消费者都是很有共同话题的,毕竟颜值实力都在那摆着,感兴趣的小伙伴一起来了解下吧。在外观方面优衣库全球旗舰店携手上海交通广播畅聊秋冬功能美学魅力新品跨行业嘉宾分享无界生活理念一起自由穿行美好生活8月18日,优衣库携手FM105。7上海交通广播,在上海全球旗舰店打造线下直播间,同步开启视听互动体验。邀请上海知名电台主持人任重与各益达魔性大片引疯传系鹿晗限量装广告最近,4支春运自驾主题的魔性视频在网络上被疯传,一时间掀起了醒神春运的热门话题,这4支画风魔性音乐洗脑的视频是益达针对春运自驾推出的鹿晗新年限量装产品广告。一年一度的春运浪潮即将来功能饮料行业已进入最好时代红牛继续C位领跑近年来,功能性饮料行业的快速发展令人瞩目。据欧睿国际数据,20132017年全球功能饮料市场规模年均复合增速是12。9,远高于饮料行业3。7的复合增速,从数据来看,这说明消费者对功AI技术驱动新体验叮咚课堂让家长更放心在中国国际化程度不断加深的大背景下,家长们也越来越重视孩子的英语学习情况。对于少儿来说,410岁是其英语学习黄金时期,在这个阶段打好英语基础建立系统语言体系极为重要。线上英语教育已燃气热水器深夜报警,拯救一家六口性命冬季是一氧化碳中毒多发期,人们取暖洗澡做饭用燃气概率增大,在户型不合理室内通风条件差门窗紧闭的情况下极易发生一氧化碳中毒的情况。近日,山东青岛的一家六口就险遭一氧化碳中毒,好在家中年轻人的西装,从ampampquot不好好穿ampampquot随着千禧一代在商业世界陆续登场,他们对时尚的要求在模糊西服着装要求的边界,他们更倾向穿的舒服和潮流,他们正用全新的西装穿衣风格,逐步瓦解刻板的正式套装穿衣方式。这一季利郎就把西服玩和苦夏说再见!让料理机治好各种没胃口绿槐高柳咽新蝉,薰风初入弦。虽然夏季总给人一种充满活力和生机的感觉,但是闷热潮湿的热浪也往往让人提不起胃口,尤其还有梅雨季节的困扰,通常是一整个月都只能待在室内,身体也会进入缓慢的
这么多USB接口你都认识吗?带你了解现在最常用的USBtypec接口上一篇监控摄像头详细安装方法图解,了解了解以备不时之需USBC接口全称为USBTypeC接口,是一个接口规范,由TypeC插头和TypeC插座组成。USBC接口和typec接口没有北京逐步提高健康宝弹窗4状态解除更新频度中新网北京5月6日电(徐婧)北京市经济和信息化局副局长彭雪海6日表示,北京健康宝团队在错开访问高峰,并确保系统稳定前提下,已自今日起开始试行弹窗4优化解除机制,即逐步提高弹窗4的状iQOONeo6SE发布会内容整理5月6日1930iQOO的新款手机Neo6SE正式发布,看了一下发布会,整理了一些相关信息分享给大家。从宣传视频到发布会开始,官方一直在给该手机定位,电竞游戏手机。先看配置,cpuPython语句和注释我们将在本节中介绍Python语句,缩进以及注释,在本节的最后一部分,还会介绍作为一种特殊类型的Python注释Docstring。Python语句Python语句是给解释器执行的卢伟冰彻底爆发了,一亿像素120W快充VC液冷散热,仅1609元在购买电子产品时,性价比往往是我们考虑的因素,但智能手机是有点特殊的,尤其是国内的市场环境,向来都是竞争激烈,即使是看起来不咋样的机型,其实配置也都很厉害了,今天我们来聊聊红米No中端机,你只需要买这两款就够了一直以来,两千到三千档的中端机市场都是最火热,最惨烈的战场。各家也是花很多的精力希望给自己的产品加持各种buff,以获得更好的销量。最近,中端机市场迎来了联发科兄弟的加入,直接将市一加新机曝光天玑8100LCD屏品玩5月7日讯,博主数码闲聊站爆料,一加本月将会推出Ace系列新品,该机采用6。59英寸LCD高刷屏,同时搭载联发科天玑8100旗舰处理器,价格可以做到更便宜。这是目前唯一一款采用RedmiNote11T官宣,将于本月发布近日,Redmi红米手机官微宣布,全新Note系列将命名为Note11T,定位为性能小金刚,会在5月发布。具体的发布时间还没有公布,不过按照发布节奏来看不大可能是下周,可能会是下半勇于做减法,活出真我,七年之痒之际入手IKBCW210复古机械键盘前言总有人说,时尚界隔阵子又是喇叭裤渔网装直筒复活,这就是潮流是个圈。这句话一开始是用在时尚界的,后面放在其他领域都是通用的。复古其实并不是因为守旧,而是因为洗尽铅华过后,大家会突飞利浦开始发力!5系旗舰剃须刀降价赠吹风机,9W黑科技加持剃须刀对于一个男人非常重要,很多男性朋友可能不太修边幅,可能不用洗面奶,但一定会有一把好的剃须刀。往小了说关系到每天一到两分钟的剃须清洁体验,往大了说彰显一位男士的高端品味。不要觉佳能70200f4为啥是穷人必买的长焦镜头?佳能70200f4为啥是穷人必买的长焦镜头?只要谈到佳能镜头,绝对绕不开的就是红圈白炮,想必大家在新闻上也经常能见到摄影师拿着白炮拍照,威武霸气!买爆R这是我最喜欢的一只廉价红圈长