spring-event

Spring生命周期传播

看Spring源码的时候,发现Spring使用了发布消息的方式,来通知各个组件Spring状态的变化

1
2
3
4
5
6
7
starting
environmentPrepared
contextPrepared
contextLoaded
started
ready
failed

先debug一下Spring是如何通知到各个组件的?

先看一下这个starting消息

可以看到 实际的逻辑是调用 this.listeners.forEach(listener -> listener.starting(bootstrapContext))

这里的listeners 是SpringApplicationRunListener类型,只需要关心EventPublishingRunListener

来看看EventPublishingRunListener.starting()

第一步把applicationListener加到initialMulticaster中

第二步 指挥initMulticaster来castEvent

进入到initialMulticaster的实现类SimpleApplicationEventMulticaster 来看看

getApplicationListeners(event, type)就是判断这个listener是否监听这个event(里面用了一些推断的方式,不一定准确 宁愿放过不能错杀)

invokeListener实际上是请求listener.onApplicationEvent

问题1 applicationListeners是如何初始化的

EventPublishingRunListener也是通过getSpringFactoriesInstances 从spring.facories里创建

ApplicationListener列表也是一样。。

不是所有的消息都是multicastInitialEvent

started 和 ready 会各发两条消息

(AvailabilityChangeEvent.publish底层也是context.publishEvent,

先看下context.publishEvent实现做了什么,然后看看AvailabilityChange有什么作用

1.把object类型的event装扮成一个ApplicationEvent if necessary

2.把eventType定义一下

3.


spring-event
https://yzaf.top/2024/spring-event/
作者
why
发布于
2024年3月4日
许可协议