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

一、什么是模版+回调

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

bash 复制代码
              TransactionUtil.doInTransactionWithRequires(() -> {
               // 执行这个事务
                });

而doInTransactionWithRequires 这个方法接收一个函数式方法

supplier 然后内部去调用这个方法

bash 复制代码
  doInTransactionWithRequires(Suppler<T> supplier)		{
	T result = supplier.get()
}

这个就是模版+回调

模板负责"流程骨架",

回调负责"变化点注入"。

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

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

bash 复制代码
public abstract class AbstractTask {

    public final void execute() {
        before();
        doExecute();
        after();
    }

    protected void before() {}
    protected abstract void doExecute();
    protected void after() {}
}

子类继承:

bash 复制代码
public class OrderTask extends AbstractTask {
    @Override
    protected void doExecute() {      
    }
}

这个方案的问题在工程里很明显:

强依赖继承

子类越来越多

一个类只能继承一个父类

行为组合非常困难

所以在大型框架里,纯继承模板几乎不用了。

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

核心思想

不再靠子类重写方法, 而是把"变化的逻辑"作为参数传进去

这个"参数",就是 回调(Callback)。

四、源码案例Spring 的TransactionTemplate:

再看 Spring 提供的 TransactionTemplate:

bash 复制代码
transactionTemplate.execute(status -> {
    userDao.update(user);
    orderDao.create(order);
    return result;
});

对应源码里的核心逻辑:

bash 复制代码
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:

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

传进去的 RowMapper,就是回调。

JdbcTemplate 内部做的事是固定的:

变化点只有一行:

bash 复制代码
rowMapper.mapRow(rs, rowNum);

六、总结

模板 + 回调并不等于"继承 + 抽象方法"。

在现代 Java 项目里,它更多以 函数式接口 + Lambda 的形式出现。

不管是公司事务工具类、Spring TransactionTemplate,还是 JdbcTemplate,本质都是同一套思想:

模板负责流程,回调负责变化。

相关推荐
名字还没想好☜2 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
明月_清风3 小时前
为什么最近开始关注 JEV?几个实战案例告诉你答案
人工智能·后端
GetcharZp3 小时前
5 分钟拥有自己的 S3:RustFS 上手(MinIO 的 Rust 替代,Apache 2.0 可商用)
后端
行百里er4 小时前
Redis 版本演进、新特性与协议那些事儿
redis·后端
Joy T4 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
打工仔折腾 AI5 小时前
FastAPI 从本机到生产服务器:Nginx+Gunicorn+Uvicorn 完整部署实录
人工智能·后端·python·nginx·fastapi·gunicorn
IT_陈寒5 小时前
Java空指针这次真把我坑惨了
前端·人工智能·后端
moMo6 小时前
LangChain 到 LangGraph: RAG 知识库改造
后端
用户574385305116 小时前
元数据驱动的通用 CRUD 后端框架 (3- createBusiness 工厂:三层装配 + 一行出 REST)
后端