设计模式:带你用真实业务方法+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,本质都是同一套思想:

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

相关推荐
zopple19 小时前
常见的 Spring 项目目录结构
java·后端·spring
cjy00011121 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本21 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji341621 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan1 天前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer1 天前
Spring Framework 中文官方文档
java·后端·spring
Victor3561 天前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor3561 天前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer1 天前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP1 天前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪