SpringBoot中EventPublishingRunListener类的作用

EventPublishingRunListener 类的作用

EventPublishingRunListener 是 Spring Boot 中一个关键的运行监听器实现类,它负责在应用程序启动过程中发布各种应用事件。以下是它的详细作用:

核心功能

  1. 事件桥接器:将 SpringApplicationRunListener 的生命周期回调转换为 Spring 的 ApplicationEvent 事件
  2. 事件发布中心:通过 ApplicationEventMulticaster 广播应用启动过程中的各种事件
  3. 内置事件转换:将底层启动事件转换为更易使用的 Spring 应用事件

主要职责

1. 事件转换与发布

将以下 SpringApplicationRunListener 回调转换为对应的 Spring 事件:

回调方法发布的Spring事件
starting()ApplicationStartingEvent
environmentPrepared()ApplicationEnvironmentPreparedEvent
contextPrepared()ApplicationContextInitializedEvent
contextLoaded()ApplicationPreparedEvent
started()ApplicationStartedEvent
running()ApplicationReadyEvent
failed()ApplicationFailedEvent

2. 事件传播机制

public class EventPublishingRunListener implements SpringApplicationRunListener {
    private final SpringApplication application;
    private final String[] args;
    private final ApplicationEventMulticaster multicaster;

    // 初始化时创建事件广播器
    public EventPublishingRunListener(SpringApplication application, String[] args) {
        this.application = application;
        this.args = args;
        this.multicaster = new SimpleApplicationEventMulticaster();
        // 注册所有通过SpringApplication.addListeners()添加的监听器
        for (ApplicationListener<?> listener : application.getListeners()) {
            this.multicaster.addApplicationListener(listener);
        }
    }
    
    @Override
    public void starting() {
        this.multicaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args));
    }
    
    // 其他事件发布方法类似...
}

关键特点

  1. 早期事件支持

    • 能够在 ApplicationContext 创建之前发布事件(如 ApplicationStartingEvent
    • 使用独立的 ApplicationEventMulticaster 而非依赖于应用上下文的
  2. 监听器注册机制

    • 收集通过 SpringApplication.addListeners() 注册的所有监听器
    • 在应用上下文可用前就能处理事件
  3. 错误处理

    • 当发布事件失败时,会转换为 SpringApplicationException
    • 确保启动过程中的错误能被适当处理

使用场景示例

开发者可以通过监听这些事件来实现:

  1. 环境准备阶段:通过监听 ApplicationEnvironmentPreparedEvent 修改环境配置
@EventListener
public void handleEnvPrepared(ApplicationEnvironmentPreparedEvent event) {
    ConfigurableEnvironment env = event.getEnvironment();
    env.getPropertySources().addFirst(...);
}
  1. 上下文准备阶段:通过 ApplicationContextInitializedEvent 进行早期初始化
@EventListener
public void handleContextInit(ApplicationContextInitializedEvent event) {
    ConfigurableApplicationContext context = event.getApplicationContext();
    // 早期上下文操作
}
  1. 启动完成监控:通过 ApplicationReadyEvent 执行启动后检查
@EventListener
public void handleReady(ApplicationReadyEvent event) {
    // 检查外部服务连接等
}

实现原理

  1. 与SpringApplicationRunListeners的关系

    • EventPublishingRunListener 通常作为 SpringApplicationRunListeners 中的一个监听器
    • SpringApplicationRunListeners 负责协调多个运行监听器的调用顺序
  2. 事件发布流程

    SpringApplication启动 → SpringApplicationRunListeners回调 → 
    EventPublishingRunListener接收回调 → 转换为ApplicationEvent → 
    通过ApplicationEventMulticaster广播 → 触发ApplicationListener
    
  3. 特殊处理

    • 对于 ApplicationStartingEvent 这类早期事件,使用反射机制触发监听器
    • 在应用上下文就绪后,会将监听器转移到上下文中管理

这个类是 Spring Boot 事件驱动架构的核心组件之一,使得整个启动过程具有高度可扩展性。

SpringBoot实现监听器的过程是通过定义监听器并注册到Spring容器中来实现的。首先,我们需要创建一个监听器来监听特定的事件。在SpringBoot中,我们可以通过实现ApplicationListener接口来创建监听器。然后,我们可以在监听器中重写onApplicationEvent方法,该方法会在监听到指定事件发生时被调用。 接下来,我们需要将监听器注册到Spring容器中。在SpringBoot中,我们可以通过在监听器上添加@Component注解来将其注册为一个Bean。这样,Spring容器在启动时会自动扫描并注册这个监听器。 在注册监听器后,当指定的事件发生时,Spring容器会根据监听器的优先级顺序依次调用监听器的onApplicationEvent方法。在这个方法中,我们可以编写我们需要执行的逻辑。 总结起来,SpringBoot实现监听器的步骤如下: 1. 创建一个监听器,并实现ApplicationListener接口。 2. 在监听器中重写onApplicationEvent方法,编写监听到事件后的逻辑。 3. 在监听器上添加@Component注解,将其注册为一个Bean。 4. 在SpringBoot启动时,Spring容器会自动扫描并注册这个监听器。 5. 当指定事件发生时,Spring容器会自动调用监听器的onApplicationEvent方法执行相应的逻辑。 引用参考资料: :《springboot中使用监听器》 :《SpringBoot实现拦截器、过滤器、监听器过程解析》 :《目前只有一个实现EventPublishingRunListener,它把监听的过程过装成了SpringApplicationEvent事并通过内部属性广播出去,属性名为initialMulticaster,是ApplicationEventMulticaster接口的实现 SimpleApplicstionEventMulticaster.广播出去的事件对象会被SpringApplication中的listeners属性进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值