spring-event
Spring生命周期传播
看Spring源码的时候,发现Spring使用了发布消息的方式,来通知各个组件Spring状态的变化
1 |
|
先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.