本文内容
- 实现原理和标准事件
- 编程式实现自定义事件
- 基于注解的自定义事件
- 通用事件
实现原理和标准事件
Spring中的事件发布本质上是标准的观察者设计模式。ApplicationContext 中的事件处理是通过 ApplicationEvent 类和 ApplicationListener 接口提供的。如果将实现 ApplicationListener 接口的bean部署到上下文中,则每次将 ApplicationEvent 发布到 ApplicationContext 时,该bean都会得到通知。
public abstract class ApplicationEvent extends EventObject {
// 事件源
public ApplicationEvent(Object source) {
super(source);
this.timestamp = System.currentTimeMillis();
}
public final long getTimestamp() {
return this.timestamp;
}
}
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
// 处理事件
void onApplicationEvent(E event);
}
下表描述了 Spring 提供的标准事件:
事件 | 解释 |
---|---|
ContextRefreshedEvent |
在初始化或刷新时发布ApplicationContext (例如,通过使用接口refresh() 上的方法ConfigurableApplicationContext )。这里,“初始化”意味着所有 bean 都已加载,后处理器 bean 被检测并激活,单例被预先实例化,并且ApplicationContext 对象已准备好使用。只要上下文没有关闭,就可以多次触发刷新,前提是所选择的ApplicationContext 实际支持这种“热”刷新。例如,XmlWebApplicationContext 支持热刷新,但 GenericApplicationContext 不支持。 |
ContextStartedEvent |
使用接口上的方法 ApplicationContext 启动时发布。在这里,“已启动”意味着所有 bean 都接收到一个明确的启动信号。通常,此信号用于在显式停止后重新启动 bean,但它也可用于启动尚未配置为自动启动的组件(例如,尚未在初始化时启动的组件)。start()``ConfigurableApplicationContext``Lifecycle |
ContextStoppedEvent |
使用接口上的方法 ApplicationContext 停止时发布。在这里,“停止”意味着所有 的 bean 都会收到一个明确的停止信号。可以通过 调用重新启动已停止的上下文。stop()``ConfigurableApplicationContext``Lifecycle``start() |
ContextClosedEvent |
在ApplicationContext 使用接口close() 上的方法ConfigurableApplicationContext 或通过 JVM 关闭挂钩关闭时发布。在这里,“关闭”意味着所有的单例 bean 都将被销毁。一旦上下文关闭,它就到了生命的尽头,无法刷新或重新启动。 |
RequestHandledEvent |
一个特定于 Web 的事件,告诉所有 bean 一个 HTTP 请求已得到服务。此事件在请求完成后发布。此事件仅适用于使用 Spring 的 Web 应用程序DispatcherServlet 。 |
ServletRequestHandledEvent |
它的子类RequestHandledEvent 添加了 Servlet 特定的上下文信息。 |
编程式实现自定义事件
定义事件继承 ApplicationEvent
public class BlockedListEvent extends ApplicationEvent { private final String address; private final String content; public BlockedListEvent(Object source, String address, String content) { super(source); this.address = address; this.content = content; } public String getAddress() { return address; } public String getContent() { return content; } }
定义事件监听器实现 ApplicationListener
@Component public class BlockedListListener implements ApplicationListener<BlockedListEvent> { // @Async @Override public void onApplicationEvent(BlockedListEvent event) { System.out.println("收到邮件禁用发送通知,地址: " + event.getAddress() + " 内容: " + event.getContent()); } }
业务类注入 ApplicationEventPublisher 用于发布事件
@Component public class EmailSendService { @Autowired private ApplicationEventPublisher publisher; // 邮件黑名单 private List<String> blockedList;
public void sendEmail(String address, Strin