在 Java 框架开发中,经常会遇到“回调(Callback)”和“监听器(Listener)”这两个概念。二者紧密相关,但又有明显区别,理解清楚有助于快速掌握框架事件机制。
一、核心概念
1️⃣ 回调(Callback)
-
定义:让别人帮你在特定事件发生时调用你定义的逻辑。
-
特点:
-
是思想/机制,不是具体对象;
-
只关注“当事件发生时做什么”;
-
可通过函数、接口、Lambda 等实现。
-
-
应用场景:异步处理、一次性事件、短流程任务。
2️⃣ 监听器(Listener)
-
定义:对象化的回调,用于监听某类事件,当事件发生时自动触发内部方法。
-
特点:
-
是对象/接口的实现,是回调的一种封装形式;
-
可以同时监听多种事件(方法),如开始、进行中、完成;
-
可注册多个监听器,适合异步或重复事件处理。
-
-
应用场景:GUI 事件处理、文件/数据监听、网络消息、EasyExcel 数据导入等。
二、回调 vs 监听器的区别
| 区别维度 | 回调(Callback) | 监听器(Listener) |
|---|---|---|
| 本质 | 一段可被调用的逻辑(函数/方法) | 封装回调方法的对象/接口 |
| 调用方式 | 框架或系统在事件发生时调用 | 框架在事件发生时自动调用内部回调方法 |
| 结构 | 单一逻辑,通常只处理一个事件 | 封装多个方法,可处理多事件 |
| 用途 | 一次性或少量事件处理 | 异步、重复或复杂事件处理,可注册多个监听器 |
| 典型示例 | Runnable、CompletableFuture.thenApply() | EasyExcel AnalysisEventListener、Swing MouseListener、Spring ApplicationListener |
| 控制权 | 调用一次,由事件触发 | 事件发生时自动触发,可能多次调用 |
三、理解思路
-
回调:强调“在事件发生时执行我提供的逻辑”,是一种设计思想;
-
监听器:强调“注册+监听+自动触发”,是对象化的回调实现;
-
关系:监听器内部通常包含多个回调方法,每个方法对应不同的事件处理逻辑。
四、EasyExcel 示例对比
EasyExcel.read(file.getInputStream(), User.class, new UserExcelListener(userMapper))
.sheet()
.doRead();
-
事件源:Excel 解析器,每读取一行数据就是一个事件
-
监听器:
UserExcelListener封装invoke()和doAfterAllAnalysed() -
回调方法:
-
invoke():每读取一行触发 -
doAfterAllAnalysed():读取完成触发
-
你无需显式调用方法,监听器自动响应事件,这就是对象化回调的典型应用。
五、总结
-
回调是思想:让别人帮你调用逻辑;
-
监听器是实现:对象化封装回调方法,注册到事件源;
-
EasyExcel就是典型应用场景:
invoke()和doAfterAllAnalysed()是回调方法,监听器封装这些方法,由框架自动触发。

被折叠的 条评论
为什么被折叠?



