Spring Application事件机制
前言
在Spring Boot应用构建期间会发出诸如ApplicationStartingEvent、ApplicationEnvironmentPreparedEvent等事件,
在Spring Context中也是有事件的,
在Spring Cloud的配置刷新等地方,也用到了事件。
事件机制就像是观察者模式,将变化通过事件广播出去,触发应用内各部件的联动。
通过自定义事件监听器或者自定义事件,我们能够在松耦合的结构下对应用变化做感知,达到我们期望的一致性。
SpringApplicationRunListener
SpringApplicationRunListeners
AbstractApplicationContext
SimpleApplicationEventMulticaster
EventPublishingRunListener
ApplicationListener
初始化时机
SpringApplicationRunListeners、SpringApplicationRunListener:
Spring Application的run方法中,
将Spring.factories(SpringFactoryloader)声明的SpringApplicationRunListener子类(EventPublishingRunListener)实例化
并以集合形式传入SpringApplicationRunListeners的构造函数中。
SimpleApplicationEventMulticaster:
- 在EventPublishingRunListener的构造函数中实例化。
- 在spring Application context refresh的时候,也会initApplicationEventMulticaster创建一个新的SimpleApplicationEventMulticaster用于事件分发。
ApplicationListener:
在Spring Application构造函数中,将Spring.factories(SpringFactoryloader)声明的ApplicationListener的实现类实例化,
并设置到listener属性中。
组织关系及调用关系
图中我对组件和相互关系做了解析,我再说一点:SimpleApplicationEventMulticaster
分别会被
Spring boot应用启动时的EventPublishingRunListener
和应用运行时的ApplicationContext
实例化和调用。
Spring Boot应用启动时的事件
- starting(ApplicationStartingEvent) 在SpringApplication启动时就调用
- environmentPrepared(ApplicationEnvironmentPreparedEvent) 在environment准备好时调用
- contextPrepared(ApplicationContextInitializedEvent) context初始化后调用
- contextLoaded(ApplicationPreparedEvent) 加载了bean资源后发出该事件。
- started(ApplicationStartedEvent) 刷新了context后发出的事件。
- running(ApplicationReadyEvent) 调用完ApplicationRunner和CommandLineRunner后发出的事件。
- failed(ApplicationFailedEvent) 在启动时发生异常会发出该事件。
例子
我在应用启动时的例子代码中自定义了事件,具体看: 代码在这 | spring-boot-none-startup
看SimpleAppEvent类和spring.factories中的org.springframework.context.ApplicationListener。