最新Mybatis源码分析二-如何优雅的使用主体日志,Redis宕机数据丢失解决方案

最后

由于篇幅原因,就不多做展示了

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

2.1.第三方日志组件兼容的实现


从需求上分析,日志模块的第一个需求是一个典型的使用适配器模式的场景。

2.1.1.适配器模式含义

适配器模式(Adapter Pattern) 是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口。适 配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;类图如下:

角色代表含义:

Target:目标角色,期待 得到的接口.

Adaptee:适配者角色, 被适配的接口.

Adapter:适配器角色, 将源接口转换成目标 接口.

适用场景:当调用双方都不太容易修改的时候,为了复用现有组件可以使用适配器模式;在 系统中接入第三方组件的时候经常被使用到;

PS:如果系统中存在过多的适配器,会增加 系统的复杂性,设计人员应考虑对系统进行重构;

2.1.2.MyBatis 日志模块适配器的使用

mybatis的日志模块的主要实现如下:

  • Target:mybatis中org.apache.ibatis.logging.Log扮演者target角色,用于对内提供统一的日志接口;

  • Adaptee:其他日志组件组件如 slf4J 、commonsLoging 、 Log4J2 等被包含在适配器中,用于被适配。

  • Adapter:针对每个日志组件都提供了适配器, 每 个 适 配 器 都 对 特 定 的 日 志 组 件 进 行 封 装 和 转 换 ,保证对外提供一同的使用标准。; 如 Slf4jLoggerImpl JakartaCommonsLoggingImpl 等;

mybatis的日志模块实现采用适配器模式,日志组件(Target)、适配器以及统一接口(Log 接口) 定义清晰明确符合单一职责原则;同时,客户端在使用日志时,面向 Log 接口编程,不需要 关心底层日志模块的实现,符合依赖倒转原则;最为重要的是,如果需要加入其他第三方日 志框架,只需要扩展新的模块满足新需求,而不需要修改原有代码,这又符合了开闭原则。

2.2.日志组件顺序加载的实现


日志组件的顺序加载实现比较简单,mybatis加载之后在静态代码块中完成的加载。不在过多讲解。

2.3.优雅的使用日志模块的实现


我们在打开mybatis日志的时候,无需任何多余的操作,只需将配置打开即可将看到执行日志。那么我们要实现优雅日志,首先我们得搞清楚,在什么情况下要打日志,通过我们对日志的使用,一般有如下几个位置需要进行日志打印

  1. 在创建 prepareStatement 时,打印执行的 SQL 语句;

  2. 访问数据库时,打印参数的类型和值

  3. 查询出结构后,打印结果数据条数

在mbatis的日志模块中有 BaseJdbcLogger、ConnectionLogger、PreparedStatementLogger 和 ResultSetLogge 通过动态代理负责在不同的位置打印日志;

说到动态代理那么很显然,mybatis的日子增强是通过代理模式进行实现的。那么我们了解下什么是代理模式。

2.3.1.代理模式

**代理模式定义:**给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用;

例如小王要买个化妆品,但是他不知道渠道,只能通过小张这个海外代购渠道去购买化妆品店。 因此小王不需要和化妆品店直接交互,由小张代理帮他购买即可。

主要目的:

  1. 通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的 不必要复杂性;

  2. 通过代理对象对原有的业务增强;

代理模式有静态代理动态代理两种实现方式。

静态代理

这种代理方式需要代理对象和目标对象实现一样的接口。

优点:可以在不修改目标对象的前提下扩展目标对象的功能。

缺点:由于代理对象要实现与目标对象一致的接口,会产生过多的代理类。不易维护。一旦接口增加方法,目标对象与代理对象都要进行修改。

动态代理

动态代理利用了 JDK API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能。

动态代理又被称为 JDK 代理或接口代理。

静态代理与动态代理的区别主要

1. 静态代理在编译时就已经实现,编译完成后代理类是一个实际的 class 文件

2. 动态代理是在运行时动态生成的,即编译完成后没有实际的 class 文件,而是在运行时 动态生成类字节码,并加载到 JVM 中 注意:动态代理对象不需要实现接口,但是要求目标对象必须实现接口,否则不能使用动态 代理。

JDK 中生成代理对象主要涉及两个类,第一个类为 java.lang.reflect.Proxy,通过静态方法 newProxyInstance 生成代理对象,第二个为 java.lang.reflect.InvocationHandler 接口,通过 invoke 方法对业务进行增强;

2.4.Mybatis日志模块实现分析


2.4.1.基础日志组件

刚才我们讲到mybatis的日志模块中有 BaseJdbcLogger、ConnectionLogger、PreparedStatementLogger 和 ResultSetLogge 通过动态代理负责在不同的位置打印日志;他们的类图如下:

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

644277858)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值