spring源码-refresh中的initApplicationEventMulticaster和registerListeners
想要了解这两个方法,我们先得有的前置知识

我们首先创建一个事件,然后创建一个监听器去执行事件的方法

我们进行发布事件

那么就能够成功发布并且广播事件,然后被监听到进行调用了
我们看看publisEvent的源码

主要看圈中的这一段,拿到应用事件的广播器,去进行多路广播事件,那么它的事件广播器是怎么来的?

就是在refresh的initApplicationEventMulticaster这里初始化的,那我们再看怎么进行广播的,进去看multicastEvent如何广播

这里的for循环拿到的getApplicationListeners拿到了监听器,那么我们监听器从哪里拿到的,一样也是refresh中的去初始化的

这是我们需要提前得知的关于监听器和广播器的知识
那么我们进入initApplicationEvenMulticaster,既然说了是做初始化肯定就是set一些东西然后去注册bean吧?

先拿到了我们一直在用的核心DefaultListableBeanFactory,然后判断是否已经存在这个bean了,那么我们刚开始初始化肯定是没有的,就会进入else,首先new了一个简单应用事件广播器

set一下beanFactory,
然后去注册单例bean

这个方法已经出现三遍了,前面两篇都出现过
熟悉的味道,去注册单例bean,那么这样广播器就注册完成了
然后的话就是

进入查看源码

刚开始applicationListeners是肯定没有的,然后我们去getBeanNamesForType拿到注册过的bean,然后进行for循环将事件的广播器设置上需要被监听的bean
这个applicationListenerBeans
就是一个set不能重复
然后再去将earlyApplicationEvents赋值,这个earlyApplicationEvents其实就是在没有初始化发布器之前,如果存在使用事件方法的情况,那么就会存入到这个早期应用事件中,等到广播器初始化完成,并且注册监听器时就会做一个补偿广播
我们再关注一下广播事件的源码

它拿到监听器然后去肯定做触发监听器

listener.onApplicationEvent就是调用了我们重写的方法

再去捋一遍publishEvent的顺序,首先

判断event是不是applicationEvent并做一个强转,早期应用事件我们没有使用到,那么就不执行,走到else中,进行事件的广播

我们需要跳过一轮debug,因为第一轮是spring自己使用的一个事件的广播,第二轮才是我们自定义的MyEvent,这里的type其实就是

最后我们调用监听器

没有error跳过,调用doInvokeListener
这里调用到我们的MyListenner

这就是整个事件发布的流程


浙公网安备 33010602011771号