Skip to content

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 接口:

  1. 直接实现接口:创建一个类实现 ApplicationListener 接口,并重写 onApplicationEvent 方法。
  2. 使用 @EventListener 注解

这里着重介绍实现 ApplicationListener 接口的方式

自定义监听器的实现步骤

Spring Boot 事件监听器的实现通常涉及到以下几个步骤:

  1. 定义事件:创建一个继承自 ApplicationEvent 的类,表示你想要监听的事件类型。
  2. 创建监听器:实现 ApplicationListener 接口或使用 @EventListener 注解的方法,来定义当事件被触发时应该执行的操作。
  3. 发布事件:在应用程序的适当位置,使用 ApplicationEventPublisher 发布你定义的事件。

定义事件

java
@Getter
public class LoginEvent extends ApplicationEvent {

    private final Long userId;

    public LoginEvent(Object source,Long userId) {
        super(source);
        this.userId = userId;
    }
}

创建监听器

为了提高灵活性和可维护性,我们可以定义一个通用的 EventHandler 接口和一个抽象类 AbstractEventHandler,然后为具体的事件创建监听器。

java
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 注解,以便异步处理事件,避免阻塞主线程。

发布事件

java

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 中非常有用的功能,它们允许开发者在应用程序生命周期的关键时刻插入自定义逻辑。通过理解和扩展这些特性,我们可以构建更加灵活、响应迅速且易于维护的应用程序。

Released under the MIT License.