spring applicationevent/applicationlistener 是容器内同jvm轻量级事件机制,用于业务解耦,如用户注册后发邮件;需继承applicationevent定义事件,用@eventlistener监听,通过applicationeventpublisher发布,事件默认不跨容器传播。

Spring 的 ApplicationEvent 和 ApplicationListener 是轻量级的事件机制,用于在 Spring 容器内解耦组件间的通信。它不是为高并发或跨服务设计的,而是适合“容器内、同 JVM、业务逻辑解耦”场景,比如监听用户注册后发送欢迎邮件、清缓存、记录日志等。
定义自定义事件(继承 ApplicationEvent)
事件本质是一个 POJO,需继承 ApplicationEvent,并传入一个 source(通常是发布者对象,常用 this 或 ApplicationContext):
// 示例:用户注册成功事件
public class UserRegisteredEvent extends ApplicationEvent {
private final String username;
public UserRegisteredEvent(Object source, String username) {
super(source);
this.username = username;
}
public String getUsername() {
return username;
}
}
编写监听器(实现 ApplicationListener 或用 @EventListener)
两种主流写法,推荐后者(更简洁、支持条件监听、可异步):
- @EventListener:直接标注在方法上,Spring 自动注册,支持泛型推导和 SpEL 条件
-
实现 ApplicationListener
:传统方式,需手动注册或靠类路径扫描(要求类是 Spring Bean)
// 推荐写法:基于注解的监听器
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
@Component
public class WelcomeEmailListener {
@EventListener
public void handleUserRegistered(UserRegisteredEvent event) {
System.out.println("发送欢迎邮件给:" + event.getUsername());
// 实际调用邮件服务...
}
// 可加条件:只处理用户名长度 > 3 的事件
@EventListener(condition = "#event.username.length() > 3")
public void handleQualifiedUser(UserRegisteredEvent event) {
// ...
}
}
发布事件(通过 ApplicationEventPublisher)
不能直接 new 事件然后“发出去”,必须由 Spring 容器托管的 ApplicationEventPublisher 发布。通常通过 @Autowired 注入,也可让类实现 ApplicationEventPublisherAware 接口(不推荐):
@Service
public class UserService {
@Autowired
private ApplicationEventPublisher publisher;
public void register(String username) {
// 保存用户...
// 发布事件
publisher.publishEvent(new UserRegisteredEvent(this, username));
}
}
注意:publishEvent 是同步调用,监听器执行完才返回;如需异步,可配合 @Async(需开启异步支持)。
事件传播与作用域说明
Spring 事件默认只在当前 ApplicationContext 内传播。父子容器之间不会自动传递(除非手动桥接)。常见误区:
- Web 环境中,
DispatcherServlet有自己的子容器,其事件不会被根容器监听到 - 测试时若用
@SpringBootTest,默认加载完整上下文,事件能正常工作 - 如果监听器没生效,先确认类是否被扫描为 Bean,再检查事件类型是否匹配(泛型擦除可能导致监听失败)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










