SpringBoot监听器

2,385 阅读2分钟

介绍

image.png

要素

  • 事件
  • 监听器
  • 广播器
  • 触发机制

事件发生顺序

image.png

image.png

监听器注册

image.png

监听器事件触发机制

获取监听器列表

image.png

通用触发条件

image.png

SpringApplicationRunListener

从命名我们就可以知道它是一个监听者,那纵观整个启动流程我们会发现,它其实是用来在整个启动流程中接收不同执行点事件通知的监听者,SpringApplicationRunListener接口规定了SpringBoot的生命周期,在各个生命周期广播相应的事件,调用实际的ApplicationListener类。

public interface SpringApplicationRunListener {

     //刚执行run方法时
    void started();
     //环境建立好时候
    void environmentPrepared(ConfigurableEnvironment environment);
     //上下文建立好的时候
    void contextPrepared(ConfigurableApplicationContext context);
    //上下文载入配置时候
    void contextLoaded(ConfigurableApplicationContext context);
    //上下文刷新完成后,run方法执行完之前
    void finished(ConfigurableApplicationContext context, Throwable exception);

}

它定义了5个步骤:

  1. started(run方法执行的时候立马执行;对应事件的类型是ApplicationStartedEvent):通知监听器,SpringBoot开始执行
  2. environmentPrepared(ApplicationContext创建之前并且环境信息准备好的时候调用;对应事件的类型是ApplicationEnvironmentPreparedEvent):通知监听器,Environment准备完成
  3. contextPrepared(ApplicationContext创建好并且在source加载之前调用一次;没有具体的对应事件):通知监听器,ApplicationContext已经创建并初始化完成
  4. contextLoaded(ApplicationContext创建并加载之后并在refresh之前调用;对应事件的类型是ApplicationPreparedEvent):通知监听器,ApplicationContext已经完成IoC配置价值
  5. finished(run方法结束之前调用;对应事件的类型是ApplicationReadyEvent或ApplicationFailedEvent):通知监听器,SpringBoot启动完成

监听器的实现

实现ApplicationListener接口针对单一事件监听

//Order值越小越先执行
@Order(1)
public class FirstListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("FirstListener is run");
    }

}

实现SmartApplicationListener针对多种事件监听

@Order(4)
public class FourthListener implements SmartApplicationListener {

    /**
     * 自定义事件支持执行的操作
     * 运行程序可以看到控制台打印了两次 FourthListener is run 因为我们这里定义了两个事件支持
     * @param eventType
     * @return
     */
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return ApplicationStartedEvent.class.isAssignableFrom(eventType) || ApplicationReadyEvent.class.isAssignableFrom(eventType);
    }

    /**
     * 当事件发生时执行的操作
     * @param event
     */
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("FourthListener is run");
    }
}

监听器的注册方式

方式一:spring.factories配置

#注册自定义的监听器
org.springframework.context.ApplicationListener=com.ecit.learn.listener.FirstListener

方式二:启动类添加

@SpringBootApplication
@MapperScan("com.ecit.learn.mapper")
public class SpringbootLearnApplication {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(SpringbootLearnApplication.class);
        //添加初始化启动器
        springApplication.addInitializers(new SecondInitializer());
        //添加自定义的监听器
        springApplication.addListeners(new SecondListener());
        springApplication.run(args);
    }

}

方式三:配置文件配置

context.listener.classes=com.ecit.learn.listener.ThirdListener