来到了initApplicationEventMulticaster:
在上一讲中,我们已经搞清楚了如下initMessageSource方法所做的事情,它无非就是来初始化MessageSource组件的。
初始化事件派发器initApplicationEventMulticaster - 图1
然后,我们让程序运行到以上第534行代码(即initApplicationEventMulticaster方法)处。顾名思义,该方法是来初始化事件派发器的。
你有没有想过这样一个问题,为什么Spring容器在创建的过程中还要调用这样一个初始化事件派发器的方法呢?没想过,就算了,这里我直接给出答案,这是因为需要一个事件派发器对我们Spring中的事件进行一些派发、管理以及通知等。
那么,究竟是如何来初始化事件派发器的呢?这时,我们就得来好好研究一下initApplicationEventMulticaster方法里面究竟做了些什么事了。

获取BeanFactory

按下F5快捷键进入到initApplicationEventMulticaster方法里面,如下图所示,可以看到一开始是先来获取BeanFactory的。
初始化事件派发器initApplicationEventMulticaster - 图2

看容器中是否有id为applicationEventMulticaster,类型是ApplicationEventMulticaster的组件

按下F6快捷键让程序继续往下运行,会发现有一个判断,即判断BeanFactory中是否有一个id为applicationEventMulticaster的组件。我为什么会这么说呢,你只要看一下常量APPLICATION_EVENT_MULTICASTER_BEAN_NAME的值就知道了,如下图所示,该常量的值就是applicationEventMulticaster。
初始化事件派发器initApplicationEventMulticaster - 图3

若有,则赋值给this.applicationEventMulticaster

如果有的话,那么会从BeanFactory中获取到id为applicationEventMulticaster,类型是ApplicationEventMulticaster的组件,并将其赋值给this.applicationEventMulticaster。这可以从下面这行代码看出。

初始化事件派发器initApplicationEventMulticaster - 图4
也就是说,如果我们之前已经在容器中配置了一个事件派发器,那么此刻就能从BeanFactory中获取到该事件派发器了。
很显然,容器刚开始创建的时候,肯定是还没有的,所以程序会来到下面的else语句中。

若没有,则创建一个SimpleApplicationEventMulticaster类型的组件,并把创建好的组件注册在容器中

如果没有的话,那么Spring自己会创建一个SimpleApplicationEventMulticaster类型的对象,即一个简单的事件派发器。
然后,把创建好的事件派发器组件注册到容器中,即添加到BeanFactory中,所执行的是下面这行代码。
初始化事件派发器initApplicationEventMulticaster - 图5
这样,我们以后其他组件要使用事件派发器,直接自动注入这个事件派发器组件即可。