高级java每日一道面试题-2025年01月19日-框架篇[Mybatis篇]-MyBatis 中见过什么设计模式 ?

devtools/2025/1/21 22:08:33/

如果有遗漏,评论区告诉我进行补充

面试官: MyBatis 中见过什么设计模式 ?

我回答:

1. 工厂模式(Factory Pattern)

定义:工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式,将对象创建过程抽象化,从而提高代码的可维护性和灵活性。

在MyBatis中的应用

  • SqlSessionFactoryBuilderSqlSessionFactory 的创建过程体现了工厂模式的应用。SqlSessionFactoryBuilder 负责读取 MyBatis 配置文件,并构建出 SqlSessionFactory 实例。
  • Mapper接口的实现:MyBatis 使用工厂模式来动态生成 Mapper 接口的实现类。当调用 getMapper() 方法时,MyBatis 根据映射配置为每个 Mapper 接口创建代理实例。

2. 单例模式(Singleton Pattern)

定义:单例模式确保一个类只有一个实例,并提供一个全局访问点,保证在整个应用程序生命周期内共享同一个实例。

在MyBatis中的应用

  • SqlSessionFactory 是单例模式的经典案例。一旦通过 SqlSessionFactoryBuilder 创建了 SqlSessionFactory 实例后,该实例会在整个应用程序中被复用,避免了重复创建实例所带来的资源浪费。
  • TypeAliasRegistry 和其他注册表也通常是单例的,确保类型别名和其他配置信息在整个应用程序中的一致性。

3. 建造者模式(Builder Pattern)

定义:建造者模式旨在将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示,简化了对象的构造过程。

在MyBatis中的应用

  • XMLConfigBuilderXMLMapperBuilder 等类使用了建造者模式来解析 MyBatis 的配置文件和映射文件。这些 Builder 类逐步构建出配置信息和映射信息,提高了代码的清晰度和可维护性。
  • SqlSessionFactoryBuilder 也是建造者模式的一个例子,它负责根据配置创建 SqlSessionFactory

4. 代理模式(Proxy Pattern)

定义:代理模式为其他对象提供一个代理以控制对这个对象的访问,通常用于添加额外的功能而不改变原有接口。

在MyBatis中的应用

  • Mapper接口的实现:MyBatis 使用 JDK 动态代理或 CGLIB 来生成 Mapper 接口的代理实现。代理对象拦截方法调用,执行必要的 SQL 操作,并返回结果。这种方式允许 MyBatis 在不修改业务代码的情况下插入事务管理、缓存处理等横切关注点。
  • 懒加载机制:MyBatis 中的延迟加载功能也是通过代理模式实现的,它允许查询操作的结果集在真正需要时才被加载,提高了性能。

5. 模板方法模式(Template Method Pattern)

定义:模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,允许子类在不改变算法结构的情况下重定义某些步骤。

在MyBatis中的应用

  • BaseExecutor 类是模板方法模式的具体体现。它定义了数据库操作的基本流程(如查询、更新、提交事务等),但具体的执行逻辑由其子类(如 SimpleExecutorBatchExecutor 等)实现。
  • SQL语句执行流程:无论是 SELECT 还是 INSERT/UPDATE/DELETE 操作,MyBatis 都遵循一定的流程模板,只是具体的操作细节有所不同。

6. 策略模式(Strategy Pattern)

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换,支持运行时动态选择算法。

在MyBatis中的应用

  • 缓存策略:MyBatis 支持多种缓存策略(如一级缓存、二级缓存),并且允许用户配置不同的缓存实现(例如 EHCache、OSCache)。这体现了策略模式,使得框架具有高度的灵活性和扩展性。
  • 事务管理策略:MyBatis 支持不同的事务管理器(如 JDBC 事务管理器、Spring 管理的事务管理器),允许根据环境需求选择合适的事务管理策略。

7. 观察者模式(Observer Pattern)

定义:观察者模式定义了一种依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

在MyBatis中的应用

  • Configuration对象:在 MyBatis 中,Configuration 对象会监听映射文件的解析事件,并在解析完成后更新自己的状态。此外,当有新的映射文件被加入或者现有映射文件被修改时,Configuration 也会相应地作出调整。
  • 插件机制:MyBatis 的插件系统也是一种观察者模式的应用,插件可以在特定的时间点拦截并处理请求,例如在执行 SQL 之前或之后。

8. 适配器模式(Adapter Pattern)

定义:适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

在MyBatis中的应用

  • ResultSetHandler:MyBatis 中的 ResultSetHandler 接口及其默认实现 DefaultResultSetHandler 是适配器模式的应用。它把 JDBC 的 ResultSet 对象转换为 POJO 或其他形式的数据结构,以适应应用程序的需求。这种模式允许 MyBatis 将底层的 JDBC 结果集与上层的应用程序数据模型进行适配。

9. 责任链模式(Chain of Responsibility Pattern)

定义:责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

在MyBatis中的应用

  • 插件机制:MyBatis 的插件机制是责任链模式的一个实例。你可以开发多个插件,它们按照一定的顺序被调用,每个插件都有机会处理请求或响应,或者决定是否传递给下一个插件。这种模式使得插件可以依次处理请求,直到某个插件处理完毕或所有插件都尝试过。

综上所述,MyBatis 广泛采用了上述九种设计模式,这些模式不仅提升了框架本身的内聚性、可扩展性和灵活性,也为开发者提供了强大的工具来解决持久层开发中的复杂问题。在面试中,能够详细阐述这些设计模式在 MyBatis 中的具体应用及其带来的好处,有助于展示你的技术深度和广度。


http://www.ppmy.cn/devtools/152433.html

相关文章

mysql的mvcc

快速搞懂mvcc 全称 multi-version concurrency control 多版本并发控制。自动开启事务undo log读视图(read_view)结果过滤mvcc只在读已提交和可重复读隔离级别下运作读已提交隔离级别下,可重复读隔离级别下,总的来说mvcc是为了提高数据库并发性能而设计的…

2025美赛Latex模板可直接运行!O奖自用版

目录 01 预览图02 Latex模板main.texeasymcm.sty 2025年美国大学生数学建模大赛(2025年1月23日)马上开始啦,大家一定要提前准备好模板,Latex或者是Word都可以,这里我整理了之前比赛用到的模板,并进行了一些…

在 JIRA 中利用仪表盘功能生成 Bug 相关图表的手册

引言 JIRA 是 Atlassian 推出的项目管理工具,广泛应用于软件开发、团队协作和问题跟踪。对于开发团队和项目经理而言,能够清晰地了解当前 Bug 状态、优先级分布及进展情况至关重要。JIRA 提供了强大的 仪表盘功能,让用户能够通过各种图表直观…

magic-dash:纯Python轻松开发网页应用

来源:Python大数据分析 费弗里 大家好我是费老师,今天要给大家介绍的开源Python项目magic-dash,提供了一系列内置的「纯Python」网页应用项目模板,通过执行简单的终端命令,即可快速生成对应类型的网页应用项目工程&…

Vue3轮播图左右联动

1、轮播图部分,右边鼠标移入,左边对应展示轮播图 可以在swiper 官网 Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 选择vue中使用swiper npm i swiper 左右两边的联动:左边的轮播图和右边的小的列表他们的列表组成结构是一样的&#…

基于Spring Boot3 + Vue3 + JDK17的现代化的Java应用开发框架

快速启动 Guns v8前端启动 前端需要使用Node 20,请先安装node20,请使用yarn启动,具体启动方法如下: # 安装依赖 yarn# 启动前端项目 yarn run dev# 打包 npm run buildGuns v8后端启动 以下为后台启动的过程: 重要…

随遇随记篇

vue 函数 unref() 获取原始值 ref 定义的属性 需要 .value 才能拿到值&#xff0c;unref 直接返回原始值&#xff1b;若属性不是ref 定义的&#xff0c;也是直接返回原始值&#xff1b; /* description: 是否必填*/required?: boolean | Ref<boolean>.....let value …

JavaScript 拖拽与观察者模式的实现及应用

前言 本文将通过几个具体的代码片段&#xff0c;深入探讨 JavaScript 中的拖拽功能和观察者模式&#xff08;发布-订阅模式&#xff09;的实现及其应用场景。 这些代码片段不仅展示了如何实现这些功能&#xff0c;还解释了其背后的原理和实际用途。通过阅读本文&#xff0c;读…