Mybatis框架之观察者模式 (Observer Pattern)

在 MyBatis 框架中,观察者模式 (Observer Pattern) 主要用于监听配置和执行过程中的事件,如缓存刷新、动态 SQL 解析、数据源切换等。这种模式为 MyBatis 提供了一种事件驱动的机制,使其在各个模块之间实现松耦合的通知和响应。

1. 什么是观察者模式 (Observer Pattern)?

观察者模式 是一种行为型设计模式,定义了一种一对多的依赖关系,使得多个观察者对象在被观察对象的状态发生变化时,能够自动接收到通知并进行更新。这种模式通常用于事件处理系统中,允许对象在不直接依赖其他对象的情况下,自动响应事件的变化。

特点
  • 一对多关系:一个被观察对象(Subject)可以有多个观察者(Observers)。
  • 解耦通知和响应:被观察对象无需知道观察者的具体实现,只需发送通知即可。
  • 事件驱动:常用于日志系统、事件通知、数据绑定等场景。
观察者模式的组成
  • Subject(被观察者):维护一个观察者列表,并在自身状态发生变化时通知观察者。
  • Observer(观察者):定义响应接口,当收到通知时执行相应的操作。
  • ConcreteSubject 和 ConcreteObserver:具体的被观察者和观察者实现。

2. MyBatis 中观察者模式的应用场景

在 MyBatis 中,观察者模式的主要应用场景包括:

  • 配置文件的监听和加载:MyBatis 会监听配置文件的变化,以支持动态刷新配置。
  • 动态 SQL 解析事件:MyBatis 允许监听和处理动态 SQL 的解析过程,如 <if><foreach> 等标签的解析。
  • 缓存刷新:MyBatis 支持二级缓存,当表数据发生变化时,会通过观察者模式刷新缓存。
  • 插件机制:MyBatis 的插件机制也可以理解为一种观察者模式的变种,用于监听 SQL 执行的各个阶段。

3. MyBatis 观察者模式的典型应用 —— 缓存机制

MyBatis 的缓存机制使用了类似观察者模式的设计来管理二级缓存的刷新。当数据发生变更时(如执行 INSERTUPDATEDELETE 操作),MyBatis 会通知相关的缓存区域进行刷新或失效,从而保持数据的一致性。

结构示意图
|------------|         Notify        |----------------|
|  Executor  |---------------------->| CacheManager  |
|------------|                      |----------------||                                    || Notify                             | Invalidate Cachev                                    v
|----------------|                   |------------------|
| Cache Observer |  <--------------  | Cache (e.g., LRU)|
|----------------|                   |------------------|

4. 代码示例:MyBatis 缓存中的观察者模式

Step 1:定义 CacheObserver 接口(观察者)
public interface CacheObserver {void onCacheEvicted(String cacheKey);
}
Step 2:实现 CacheManager(被观察者)
import java.util.ArrayList;
import java.util.List;public class CacheManager {private List<CacheObserver> observers = new ArrayList<>();// 添加观察者public void addObserver(CacheObserver observer) {observers.add(observer);}// 通知观察者缓存已失效public void notifyCacheEviction(String cacheKey) {for (CacheObserver observer : observers) {observer.onCacheEvicted(cacheKey);}}// 模拟数据变更后清除缓存public void updateData(String cacheKey) {System.out.println("Data updated in database.");notifyCacheEviction(cacheKey);}
}
Step 3:实现具体的缓存观察者
public class CacheLogger implements CacheObserver {@Overridepublic void onCacheEvicted(String cacheKey) {System.out.println("Cache with key " + cacheKey + " has been evicted.");}
}
Step 4:使用观察者模式
public class MyBatisObserverExample {public static void main(String[] args) {CacheManager cacheManager = new CacheManager();CacheObserver cacheLogger = new CacheLogger();// 注册观察者cacheManager.addObserver(cacheLogger);// 模拟更新数据并触发缓存失效通知cacheManager.updateData("userCache");}
}

输出结果

Data updated in database.
Cache with key userCache has been evicted.

5. MyBatis 插件机制中的观察者模式

MyBatis 的插件机制允许开发者监听 SQL 语句的执行。在 Executor 执行 SQL 之前或之后,MyBatis 会通知已注册的插件。这种机制也类似于观察者模式的实现。

核心接口Interceptor
public interface Interceptor {Object intercept(Invocation invocation) throws Throwable;
}

6. MyBatis 中观察者模式的优势

  • 解耦模块:通过观察者模式,MyBatis 的各个功能模块(如缓存、动态 SQL)能够独立扩展,减少相互之间的耦合。
  • 提高可扩展性:开发者可以轻松添加自定义观察者,以监听 MyBatis 中的各种事件,实现日志记录、监控等功能。
  • 灵活的事件通知:MyBatis 可以动态添加或移除观察者,支持灵活的事件订阅和取消订阅。

7. MyBatis 观察者模式的不足

  • 性能开销:如果观察者过多,频繁的通知会带来一定的性能开销,尤其是在高并发环境下。
  • 调试困难:观察者模式的异步特性可能导致调试和问题定位变得更加复杂。
  • 潜在的循环依赖:如果观察者之间相互通知,可能会导致无限循环调用的问题,需要谨慎设计。

8. 总结

MyBatis 中广泛应用了观察者模式来增强其事件驱动机制。通过定义统一的事件接口和观察者机制,MyBatis 能够灵活地管理缓存刷新、动态 SQL 解析、日志记录等功能模块。观察者模式的应用提高了 MyBatis 的可扩展性,使得其能够轻松适应复杂的企业级应用场景。

观察者模式是 MyBatis 架构中的一大亮点,为开发者提供了高度的灵活性和可扩展性,特别是在缓存管理和插件扩展等场景中发挥了重要作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475386.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓手机root+magisk安装证书+抓取https请求

先讲一下有这篇文章的背景吧&#xff0c;在使用安卓手机fiddler抓包时&#xff0c;即使信任了证书&#xff0c;并且手机也安装了证书&#xff0c;但是还是无法捕获https请求的问题&#xff0c;最开始不知道原因&#xff0c;后来慢慢了解到现在有的app为了防止抓包&#xff0c;把…

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言&#xff1a;由于目前机器存储空间不够&#xff0c;所以‘斥巨资’加了一块2T的机械硬盘&#xff0c;下面是对linux扩容的一系列操作&#xff0c;包含了磁盘空间的创建、删除&#xff1b;存储挂载&#xff1b;docker迁移&#xff1b;anaconda3迁移等。 一、存储分区 1.1 …

学习虚幻C++开发日志——委托(持续更新中)

委托 官方文档&#xff1a;Delegates and Lamba Functions in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 简单地说&#xff0c;委托就像是一个“函数指针”&#xff0c;但它更加安全和灵活。它允许程序在运行时动态地调用不…

Git入门图文教程 -- 深入浅出 ( 保姆级 )

01、认识一下Git&#xff01;—简介 Git是当前最先进、最主流的分布式版本控制系统&#xff0c;免费、开源&#xff01;核心能力就是版本控制。再具体一点&#xff0c;就是面向代码文件的版本控制&#xff0c;代码的任何修改历史都会被记录管理起来&#xff0c;意味着可以恢复…

多传感器融合slam过程解析【大白话版】

SLAM&#xff08;同步定位与地图构建&#xff09;是自动驾驶、机器人导航和三维建模的关键技术之一。多传感器融合&#xff08;激光雷达、IMU、相机&#xff09;进一步提升了SLAM的鲁棒性和适应性&#xff0c;使其能够在复杂环境中实时构建高精度地图。本文将围绕激光雷达IMU相…

蓝桥杯每日真题 - 第18天

题目&#xff1a;&#xff08;出差&#xff09; 题目描述&#xff08;13届 C&C B组E题&#xff09; 解题思路&#xff1a; 问题分析 问题实质是一个带权图的最短路径问题&#xff0c;但路径的权重包含两个部分&#xff1a; 从当前城市到下一个城市的路程时间。 当前城市的…

每日论文23-24ESSERC 6.4-16.1Ghz混合并联-串联谐振器

《A 6.4-to-16.1GHz Hybrid Parallel-Series Resonator Mode-Switching Oscillator with 206.6dBc/Hz FoMT at 1MHz Offset in 40nm CMOS》 24ESSERC 首先这篇文章有个地方我其实没太明白&#xff0c;它在title和行文的时候都写的是“ hybrid parallel-series resonator mode-…

<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全

原因&#xff1a;Chrome 不信任 ssc 证书 使启用了 HTTPS&#xff0c;即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA&#xff0c;Certificate Authority】签发的&#xff09;。浏览器 Chrome 默认不信任自签名证书&#xff0c;也会报 NET::ERR_…

【再谈设计模式】适配器模式 ~接口兼容的桥梁

一、引言 在软件开发的复杂世界里&#xff0c;不同的组件、类或者系统往往有着各自独立的设计和接口定义。当需要将这些原本不兼容的部分整合在一起协同工作时&#xff0c;就像尝试将方形的榫头插入圆形的卯眼一样困难。适配器设计模式就如同一位神奇的工匠&#xff0c;能够巧妙…

无人机的激光雷达避障系统阐述!

一、材料 激光二极管基底材料&#xff1a;激光二极管是激光雷达的核心组件之一&#xff0c;其基底材料通常采用硅或砷化镓。硅材料成本低、易于加工&#xff0c;但发光效率相对较低&#xff1b;而砷化镓材料发光效率高&#xff0c;但成本较高。 光学镜片材料&#xff1a;激光…

一篇快速上手 Axios,一个基于 Promise 的网络请求库(涉及原理实现)

Axios 1. 介绍1.1 什么是 Axios&#xff1f;1.2 axios 和 ajax 的区别 2. 安装使用3. Axios 基本使用3.1 Axios 发送请求3.2 其他方式发送请求3.3 响应结构3.4 Request Config3.5 默认配置3.6 创建实例对象发送请求 3.7 拦截器3.8 取消请求 4. 模拟 Axios4.1 axios 对象创建过程…

Three.js 相机控制器Controls

在 3D 场景中&#xff0c;摄像机的控制尤为重要&#xff0c;因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器&#xff0c;最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

【新人系列】Python 入门(十一):控制结构

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

SELinux

一、简介 SELinux : 安全强化的Linux&#xff1b;在开启后,会对进程本身部署安全上下文&#xff1b;会对文件部署安全上下文&#xff1b;对法务使用端口进行限制&#xff1b;对程序本身的不安全功能做限制 二、工作原理 1、工作方式 通过MAC的方式来控制管理进程&#xff0…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗&#xff0c;一个程序写了三天写不出来&#xff0c;主要是耗时太多了&#xff0c;老板一直不满意。想在VScode上跑一下&#xff0c;昨晚一直报错。今天来公司重新搞了一下&#xff0c; 主要工作有&#xff1a; 1&#xff0c;读取当前时间用tscns 2&#xff0c;输…

Apache Paimon】-- 6 -- 清理过期数据

目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon &#xff08;表&#xff09;过期数据可以释放存储空间&#xff0c;优化资源利用并提升系统运行效…

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的&#xff0c;只需要在站点里就可以配置好&#xff0c;但是云虚拟主机在管理的时候是没有这个权限的&#xff0c;只提供了简单的域名管理等信息。 此处记录下阿里云&#xff08;原万网&#xff09;的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…

BOM的详细讲解

BOM概述 BOM简介 BOM&#xff08;browser Object&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window。 BOM由一系列的对象构成&#xff0c;并且每个对象都提供了很多方法与属性 BOM缺乏标准&#xff…

湘潭大学软件工程算法设计与分析考试复习笔记(四)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;三&#xff09; 前言 现在是晚上十一点&#xff0c;我平时是十…