SpringBoot内部事件监听器

2022-07-24 11:57:50

目的:

  • 理解SpringBoot内部事件发布、事件监听的流程。
  • 理解几个相关的核心接口/类。

1.总结

(1)SpringBoot事件发布监听流程总结

事件监听模式的核心在于:事件源封装为事件后传给监听器,当事件源触发事件后,监听器接收到事件并执行相关方法。

当一个事件源产生事件并通过发布器(上图AbstractApplicationContext类继承了发布器)发布事件后,广播器根据事件类型去上下文(应用上下文监听器集合)中找到对应的监听器,并逐个执行监听器的onApplicationEvent方法,从而完成事件监听器的逻辑。

(2)SpringBoot内部事件监听机制核心接口/类

  • ApplicationEvent:事件,每个实现类表示一类事件,可携带数据。抽象类。
  • ApplicationListener:事件监听器,用于接收事件处理时间。接口。
  • ApplicationEventMulticaster:广播器,可以注册(添加)/移除/发布事件。用于事件监听器的注册和事件的广播。接口。默认实现SimpleApplicationEventMulticaster。
  • ApplicationEventPublisherApplicationContext:事件发布者器,委托事件管理者ApplicationEventMulticaster完成事件发布。类。其中ApplicationContext实现了该接口。

ApplicationContext是关键接口,在其子类AbstractApplicationContext中就聚合了事件广播器ApplicationEventMulticaster事件监听器ApplicationListnener,并且提供注册监听器的addApplicationListnener方法。


2. SpringBoot启动过程中的内部事件

2.1 SpringBoot应用启动事件-SpringApplicationEvent

preview

总述:SpringBoot启动过程中的SpringApplication.run()方法执行过程和每个过程对应的事件如上图所示。上述所有事件都是通过应用上下文对象的中的广播器initialMulticaster.multicastEvent(event)发布,并且会执行相关监听器的回调函数(istener.onApplicationEvent(event))完成工作。

(1)ApplicationStartingEvent

springboot启动开始的时候执行的事件。listener.starting()调用。

(2)ApplicationEnvironmentPreparedEvent

environmentPrepared 表示环境变量准备完成,但此时上下文context还没有创建。在该监听中获取到ConfigurableEnvironment后可以对配置信息做操作,例如:修改默认的配置信息,增加额外的配置信息等等。

(3)ApplicationPreparedEvent

contextPrepared 表示上下文对象准备完成。spring boot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。在获取完上下文后,可以将上下文传递出去做一些额外的操作。值得注意的是:在该监听器中是无法获取自定义bean并进行操作的。

(4)ApplicationStartedEvent:

启动完毕事件

(5)ApplicationReadyEvent

springboot加载完成时候执行的事件。

(6)ApplicationFailedEvent

spring boot启动异常时执行的事件。

2.2 SpringBoot不同的阶段发出的事件-ApplicationContextEvnet

注意ApplicationContextEvent事件和2.1节SpringApplicationEvent事件都来自ApplicationEvent事件。

(1)ContextRefreshedEvent:

事件发布在ApplicationContext初始化或刷新时(例如,通过在ConfigurableApplicationContext接口使用refresh()方法)。这里,“初始化”意味着所有bean加载,post-processor bean被检测到并且激活,单例预先实例化,ApplicationContext对象可以使用了。只要上下文没有关闭,可以触发多次刷新,ApplicationContext提供了一种可选择的支持这种“热”刷新。例如,XmlWebApplicationContext支持热刷新,但GenericApplicationContext并非如此。具体是在AbstractApplicationContext的finishRefresh()方法中。

(2)ContextStartedEvent

事件发布在ApplicationContext开始使用ConfigurableApplicationContext接口start()方法。这里,“开始”意味着所有生命周期bean接收到一个明确的起始信号。通常,这个信号用于明确停止后重新启动,但它也可以用于启动组件没有被配置为自动运行(例如,组件还没有开始初始化)。


(3)ContextStoppedEvent

事件发布在ApplicationContext停止时通过使用ConfigurableApplicationContext接口上的stop()方法。在这里,“停止”意味着所有生命周期bean接收一个显式的停止信号。停止上下文可以通过重新调用start()方法。

(4)ContextClosedEvent

事件发布在ApplicationContext关闭时通过关闭ConfigurableApplicationContext接口()方法。这里,“封闭”意味着所有单例bean被摧毁。一个封闭的环境达到生命的终结。它不能刷新或重启。

(5)RequestHandledEvent

一个特定的web事件告诉所有能处理HTTP请求的bean 。这个事件是在请求完成后发布的。这个事件只适用于使用Spring的DispatcherServlet的web应用程序。

3.SpringBoot内部事件管理者

总述:在SpringBoot启动过程中,最主要的事件管理者类是SimpleApplicationEventMulticaster,该类实现了ApplicationEventMulticaster接口。

ApplicationEventMulticaster接口包含了:添加、删除监听器方法,事件发布方法multicastEvent()

public interface ApplicationEventMulticaster {
	void addApplicationListener(ApplicationListener<?> listener);
	void addApplicationListenerBean(String listenerBeanName);
	void removeApplicationListener(ApplicationListener<?> listener);
	void removeApplicationListenerBean(String listenerBeanName);
	void removeAllListeners();
	void multicastEvent(ApplicationEvent event);
	void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType);

}

4.SpringBoot内部事件监听器

总述:SpringBoot内部事件监听器,在创建SpringApplication对象时已经通过java反射的方式创建了对应的listener对象,并放到IOC容器中了。

具体的listener如下:

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.context.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.context.logging.LoggingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener
  • 作者:Little鲸鱼
  • 原文链接:https://blog.csdn.net/jainszhang/article/details/117921202
    更新时间:2022-07-24 11:57:50