news 2026/2/13 10:50:51

设计模式:带你用真实业务方法+Spring源码去理解模板 + 回调

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式:带你用真实业务方法+Spring源码去理解模板 + 回调

一、什么是模版+回调

你肯定见到过类似这样的 代码

TransactionUtil.doInTransactionWithRequires(() -> { });

而doInTransactionWithRequires 这个方法接收一个函数式方法 supplier 然后内部去调用这个方法

doInTransactionWithRequires(Suppler<T> supplier) { T result = supplier.get() }

这个就是模版+回调

模板负责“流程骨架”, 回调负责“变化点注入”。

二、先看“纯模板方法”的问题

传统的模板方法模式长这样:

public abstract class AbstractTask { public final void execute() { before(); doExecute(); after(); } protected void before() {} protected abstract void doExecute(); protected void after() {} }

子类继承:

public class OrderTask extends AbstractTask { @Override protected void doExecute() { } }
这个方案的问题在工程里很明显:
强依赖继承
子类越来越多
一个类只能继承一个父类
行为组合非常困难
所以在大型框架里,纯继承模板几乎不用了。

三、模板 + 回调:把“变化”从继承变成参数

核心思想

不再靠子类重写方法, 而是把“变化的逻辑”作为参数传进去
这个“参数”,就是 回调(Callback)。

四、源码案例Spring 的TransactionTemplate:

再看 Spring 提供的 TransactionTemplate:

transactionTemplate.execute(status -> { userDao.update(user); orderDao.create(order); return result; });

对应源码里的核心逻辑:

TransactionStatus status = transactionManager.getTransaction(definition); try { T result = action.doInTransaction(status); transactionManager.commit(status); return result; } catch (Exception ex) { transactionManager.rollback(status); throw ex; }

五、源码案例 JdbcTemplate

Spring JDBC 里最经典的 JdbcTemplate:

jdbcTemplate.query( "select * from user", (rs, rowNum) -> new User(rs.getLong("id"), rs.getString("name")) );

传进去的 RowMapper,就是回调。

JdbcTemplate 内部做的事是固定的:

变化点只有一行:

rowMapper.mapRow(rs, rowNum);

六、总结

模板 + 回调并不等于“继承 + 抽象方法”。 在现代 Java 项目里,它更多以 函数式接口 + Lambda 的形式出现。
不管是公司事务工具类、Spring TransactionTemplate,还是 JdbcTemplate,本质都是同一套思想: 模板负责流程,回调负责变化。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 9:20:17

揭秘MarkItDown智能转换:突破办公文档格式壁垒的高效解决方案

揭秘MarkItDown智能转换&#xff1a;突破办公文档格式壁垒的高效解决方案 【免费下载链接】markitdown 将文件和办公文档转换为 Markdown 的 Python 工具 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 在数字化办公浪潮中&#xff0c;文档格式转换已成…

作者头像 李华
网站建设 2026/2/11 22:32:00

【计算机毕业设计案例】基于SpringBoot + Vue的学生档案管理系统的设计与实现基于springboot的学生档案管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/10 16:28:41

虚拟社交工具革新:如何通过VRCX重构你的VRChat社交体验

虚拟社交工具革新&#xff1a;如何通过VRCX重构你的VRChat社交体验 【免费下载链接】VRCX Friendship management tool for VRChat 项目地址: https://gitcode.com/GitHub_Trending/vr/VRCX 在虚拟社交日益成为生活重要组成部分的今天&#xff0c;VRChat用户常常面临三大…

作者头像 李华
网站建设 2026/2/10 16:25:11

小程序毕设选题推荐:基于springboot的体检预约小程序基于微信小程序的医院体检管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/10 16:18:09

OCR效率提升与文本识别优化:OCRmyPDF技术解析与实战指南

OCR效率提升与文本识别优化&#xff1a;OCRmyPDF技术解析与实战指南 【免费下载链接】OCRmyPDF OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched 项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF 在数字化转型加速的今…

作者头像 李华
网站建设 2026/2/10 16:06:29

GGUF模型格式全解析:从基础到实践的深度学习框架

GGUF模型格式全解析&#xff1a;从基础到实践的深度学习框架 【免费下载链接】ggml Tensor library for machine learning 项目地址: https://gitcode.com/GitHub_Trending/gg/ggml 一、基础概念&#xff1a;GGUF的本质与价值 揭秘GGUF&#xff1a;下一代AI模型的存储革…

作者头像 李华