SpringBoot中的 ApplicationEvent和Listener

SpringBoot中除了常用的Spring框架事件,如ContextRefreshedEvent,一个SpingApplication类还能发布一些额外的事件;

注意:事实上一些事件通常在ApplicationContenxt创建之前被启动,所以无法在一个头部标有@Bean的方法中注册监听器。但是可以通过

SpringApplication.addListener(ApplicationListener... listeners)`或者`SpringApplicationBuilder.listeners(ApplicationListener... listeners)`
方法注册

如果你想让监听器忽略其创建方式,实现自动注册,你可以通过添加一个/META-INF/spring.factories到你的项目classpath下,并通过使用org.springframework.context.ApplicationListener 键引用你的监听器,如下所示

org.springframework.context.ApplicationListener=com.example.project.MyListener

若有多个监听器,使用逗号分隔

SpringBoot提供 6个应用事件类,当启动你的SpringBoot应用时,Spring Event将按以下顺序传递

1 ApplicationStartingEvent: 应用正启动准备中事件,发生在项目刚开始启动时,它发生在监听器的注册和初始化流程之后,任何其他流程之前;

ApplicationStartingEvent类源码如下:

public class ApplicationStartingEvent extends SpringApplicationEvent {
    public ApplicationStartingEvent(SpringApplication application, String[] args) {
        super(application, args);
    }
}

2 ApplicationEnvironmentPreparedEvent:应用环境准备事件,发生在应用环境Environment已准备就绪,但应用上下文ApplicationContext创建之前;

ApplicationEnvironmentPreparedEvent 类源码:

public class ApplicationEnvironmentPreparedEvent extends SpringApplicationEvent {
    private final ConfigurableEnvironment environment;

    public ApplicationEnvironmentPreparedEvent(SpringApplication application, String[] args, ConfigurableEnvironment environment) {
        super(application, args);
        this.environment = environment;
    }

    public ConfigurableEnvironment getEnvironment() {
        return this.environment;
    }
}

3 ApplicationPreparedEvent: 应用准备就绪事件,发生在加载beanDefinition定义之后,AbstractRefreshableWebApplicationContext调用refresh方法之前;

ApplicationPreparedEvent类源码如下:

public class ApplicationPreparedEvent extends SpringApplicationEvent {
    private final ConfigurableApplicationContext context;

    public ApplicationPreparedEvent(SpringApplication application, String[] args, ConfigurableApplicationContext context) {
        super(application, args);
        this.context = context;
    }

    public ConfigurableApplicationContext getApplicationContext() {
        return this.context;
    }
}

4 ApplicationStartedEvent: 应用准备工作完成事件,发生在AbstractRefreshableWebApplicationContext调用refresh方法之后,但发生在任意命令行线程任务调用之前;

ApplicationStartedEvent类源码如下:

public class ApplicationStartedEvent extends SpringApplicationEvent {
    private final ConfigurableApplicationContext context;

    public ApplicationStartedEvent(SpringApplication application, String[] args, ConfigurableApplicationContext context) {
        super(application, args);
        this.context = context;
    }

    public ConfigurableApplicationContext getApplicationContext() {
        return this.context;
    }
}

5 ApplicationReadyEvent: 应用启动就绪事件,发生在所有命令行线程任务调用完成之后,该事件表名应用可以开始给http请求提供服务了。

ApplicationReadyEvent源码如下:

public class ApplicationReadyEvent extends SpringApplicationEvent {
    private final ConfigurableApplicationContext context;

    public ApplicationReadyEvent(SpringApplication application, String[] args,                 ConfigurableApplicationContext context) {
        super(application, args);
        this.context = context;
    }

    public ConfigurableApplicationContext getApplicationContext() {
        return this.context;
    }
}

6 ApplicationFailedEvent: 应用启动失败事件,在应用启动过程中抛出异常时传递出去

ApplicationFailedEvent类源码如下:

public class ApplicationFailedEvent extends SpringApplicationEvent {
    private final ConfigurableApplicationContext context;
    private final Throwable exception;

    public ApplicationFailedEvent(SpringApplication application, String[] args, ConfigurableApplicationContext context, Throwable exception) {
        super(application, args);
        this.context = context;
        this.exception = exception;
    }

    public ConfigurableApplicationContext getApplicationContext() {
        return this.context;
    }

    public Throwable getException() {
        return this.exception;
    }
}

通常你无需使用SpringBoot的应用事件,但是你必须知道它们的存在,SpringBoot提供的事件可以帮助我们完成一系列的任务。

应用事件通常被Spring框架的事件发布机制传递出去,这种传播机制的部分功能确保了发送到一个子应用上下文中的监听器中的事件也能传播到它的祖先上下文中的监听器。这也导致了如果你的应用使用了拥有多层级的SpringApplication实例,一个监听器可能接收到同一类型应用事件的多个实例。为了让你的监听器区分事件是属于它自己上下文中的还是属于它的子孙上下文,要求监听器自己的上下文注册到Spring容器中,这样就能通过注入的上下文与事件中的山下文对比区分。可以通过实现ApplicationContextAware接口的setApplicationontext(ApplicationContext acx)方法注入,或者如果监听器是一个Bean,则可以使用@Autowired注入。

未完待续。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过实现 `ApplicationListener` 接口来添加 `SpringBoot` 启动时的监听器。以下是一个示例: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication app = new SpringApplication(MyApplication.class); app.addListeners(new MyApplicationListener()); // 添加自定义的监听器 app.run(args); } // 自定义的监听器 public static class MyApplicationListener implements ApplicationListener<ApplicationEvent> { @Override public void onApplicationEvent(ApplicationEvent event) { // 在应用程序启动时触发的逻辑处理 System.out.println("应用程序启动了!"); } } } ``` 在上面的示例,我们创建了一个 `MyApplicationListener` 类,实现了 `ApplicationListener` 接口,并重写了其 `onApplicationEvent` 方法,用于在应用程序启动时执行自定义逻辑。 在 `main` 方法,我们创建了一个 `SpringApplication` 对象,并通过 `addListeners` 方法将自定义的监听器添加到应用程序,然后调用 `run` 方法启动应用程序。 当应用程序启动时,`onApplicationEvent` 方法将被调用,并执行我们定义的逻辑处理。这里只是简单地打印一条消息,您可以根据实际需求进行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值