监听器是什么

  1. 监听器的主要作用
  • 监听器的作用是监听一些事件的发生从而进行一些操作,比如监听ServletContext,HttpSession的创建,销毁,从而执行一些初始化加载配置文件的操作,
  • 当Web容器启动后,Spring的监听器会启动监听,监听是否创建ServletContext的对象,如果发生了创建ServletContext对象这个事件(当web容器启动后一定会生成一个ServletContext对象,所以监听事件一定会发生),ContextLoaderListener类会实例化并且执行初始化方法,将spring的配置文件中配置的bean注册到Spring容器中,
  • 怎样监听是否创建servletContext???
  1. 源码解读:https://zhuanlan.zhihu.com/p/439290262
  2. 监听器实现 三种
  • 1、实现ApplicationListener接口针对单一事件监听
  • 2、实现SmartApplicationListener接口针对多种事件监听,通过在supportsEventType这个方法里面指定监听的方法类型
  • 3、Order值越小越先执行
  • 4、application.properties中定义的优于其他方式
  1. 主要类ApplicationEvent,ApplicationListener,publisher.publishEvent
  2. 使用的设计模式及实现原理 使用的 观察者模式
  3. 工作中哪里会用到监听器,实现什么样的功能?
  4. spring中用监听器实现了哪些功能 如1中介绍的
  5. 和servlet和filter 的区别?
  6. 和springboot中监听器的区别?
  7. Springboot内置事件

ApplicationStartingEvent:SpringBoot启动开始的时候发布的事件
ApplicationEnvironmentPreparedEvent:SpringBoot对应Environment准备完毕时发布的事件,此时上下文还没有创建,该事件中可以获取配置信息。通过监听该事件可以修改默认的配置信息,配置中心就是借助该事件完成将远端配置放入应用中
ApplicationContextInitializedEvent:当准备好上下文,并且在加载任何Bean之前发布的事件。该事件可以获取上下文信息
ApplicationPreparedEvent:上下文创建完成时发布的事件,此时的Bean还没有完全加载完成,只是加载了部分特定Bean。该事件可以获取上下文信息,但是无法获取自定义Bean,应为还没有被加载
ApplicationStartedEvent:上下文刷新(完成所有Bean的加载)之后,但是还没有调用任何ApplicationRunner 和CommandLineRunner运行程序之前发布的事件。该事件同样可以获取上下文信息,并且可以获取自定义的Bean
ApplicationReadyEvent:完成ApplicationRunner 和CommandLineRunner运行程序调用之后发布的事件,此时的SpringBoot已全部启动完成。该事件同样可以获取上下文信息
ApplicationFailedEvent:SpringBoot启动异常时发布的事件。该事件可以获取上下文信息和异常信息,通过该事件可以友好地完成资源的回收
上述7个事件在容器启动的合适阶段进行发布,发布顺序自上而下,可查看SpringApplication的run(String… args)方法,分别对应SpringApplicationRunListener的7个方法,源码如下:

// 该接口规定了SpringBoot的生命周期,会在各个生命周期广播响应的事件,调用实际的监听器
public interface SpringApplicationRunListener {
    // 发布ApplicationStartingEvent
    default void starting() {
    }
    // 发布ApplicationEnvironmentPreparedEvent
    default void environmentPrepared(ConfigurableEnvironment environment) {
    }
    // 发布ApplicationContextInitializedEvent
    default void contextPrepared(ConfigurableApplicationContext context) {
    }
    // 发布ApplicationPreparedEvent
    default void contextLoaded(ConfigurableApplicationContext context) {
    }
    // 发布ApplicationStartedEvent
    default void started(ConfigurableApplicationContext context) {
    }
    // 发布ApplicationReadyEvent
    default void running(ConfigurableApplicationContext context) {
    }
    // 发布ApplicationFailedEvent
    default void failed(ConfigurableApplicationContext context, Throwable exception) {
    }
}



- ServletContextListener

监听servletContext对象的创建以及销毁
执行时机:
contextInitialized(ServletContextEvent arg0) – 创建时执行
contextDestroyed(ServletContextEvent arg0) – 销毁时执行

- ServletRequestListener

监听request对象的创建以及销毁
执行时机:
requestInitialized(ServletRequestEvent sre) – 创建时执行
requestDestroyed(ServletRequestEvent sre) – 销毁时执行

  1. 事件:ApplicationEvent
ApplicationEvent是Spring事件的顶层抽象类,代表事件本身,继承自JDK的EventObject。Spring提供了一些内置事件,如ContextClosedEvent、ContextStartedEvent、ContextRefreshedEvent、ContextStopedEvent等

spring EventListener 顺序_加载