Spring Boot 基于 ApplicationListener 的扩展应用
前言
ApplicationListener 是 Spring 框架中的一个接口,它允许开发者监听并响应由 Spring 应用上下文发布的事件。在 Spring Boot 中,这个机制特别有用,因为它可以让你在应用程序生命周期的不同阶段执行特定的逻辑,而无需修改核心业务代码。下面将详细介绍 ApplicationListener 的使用方法、应用场景以及如何扩展它。
什么是 ApplicationListener?
ApplicationListener<E extends ApplicationEvent>
是一个泛型接口,用于监听特定类型的 ApplicationEvent。当应用上下文中发布了一个事件时,实现了该接口的监听器就会被触发,并调用其 onApplicationEvent 方法来处理事件。 Spring Boot 在启动过程中会自动发布一系列标准事件,这些事件涵盖了从启动到完全就绪的各个阶段。常见的事件类型包括:
- ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent
- ApplicationPreparedEvent
- ApplicationStartedEvent
- ApplicationReadyEvent
- ApplicationFailedEvent
- ...
如何实现 ApplicationListener
你可以通过两种主要方式来实现 ApplicationListener 接口:
- 直接实现接口:创建一个类实现 ApplicationListener 接口,并重写 onApplicationEvent 方法。
- 使用 @EventListener 注解
这里着重介绍实现 ApplicationListener 接口的方式
自定义监听器的实现步骤
Spring Boot 事件监听器的实现通常涉及到以下几个步骤:
- 定义事件:创建一个继承自 ApplicationEvent 的类,表示你想要监听的事件类型。
- 创建监听器:实现 ApplicationListener 接口或使用 @EventListener 注解的方法,来定义当事件被触发时应该执行的操作。
- 发布事件:在应用程序的适当位置,使用 ApplicationEventPublisher 发布你定义的事件。
定义事件
@Getter
public class LoginEvent extends ApplicationEvent {
private final Long userId;
public LoginEvent(Object source,Long userId) {
super(source);
this.userId = userId;
}
}
创建监听器
为了提高灵活性和可维护性,我们可以定义一个通用的 EventHandler 接口和一个抽象类 AbstractEventHandler,然后为具体的事件创建监听器。
public interface EventHandler<T extends ApplicationEvent> extends ApplicationListener<T> {
void handle(T t);
}
public abstract class AbstractEventHandler<T extends ApplicationEvent> implements EventHandler<T> {
@Override
@Async("threadPoolExecutor")
public void onApplicationEvent(T event) {
this.handle(event);
}
}
@Component
public class LoginEventListener extends AbstractEventHandler<LoginEvent> {
private final LogApp logApp;
public LoginEventListener(LogApp logApp) {
this.logApp = logApp;
}
@Override
public void handle(LoginEvent loginEvent) {
logApp.login(loginEvent.getUserId());
}
}
注意,在 onApplicationEvent 方法上我们添加了 @Async 注解,以便异步处理事件,避免阻塞主线程。
发布事件
public interface EventPublish {
void publishLoginEvent(Long userId);
}
@Component
public class EventPublishImpl implements EventPublish {
private final ApplicationEventPublisher applicationEventPublisher;
public EventPublishImpl(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
@Override
public void publishLoginEvent(Long userId) {
applicationEventPublisher.publishEvent(new LoginEvent(this,userId));
}
}
测试
当我们登录的时候,就会看到触发登录事件
总结
ApplicationListener 和 @EventListener 是 Spring Boot 中非常有用的功能,它们允许开发者在应用程序生命周期的关键时刻插入自定义逻辑。通过理解和扩展这些特性,我们可以构建更加灵活、响应迅速且易于维护的应用程序。