你知道事件多播器是怎么拿到的吗?
接下来,我们得来说另一点了。你是不是注意到了这一点,在上面我们讲述事件发布的流程时,会通过一个getApplicationEventMulticaster方法来获取事件多播器,我们不妨看一下该方法是怎么写的,如下图所示。
通过该方法可以获取到事件多播器,很显然,applicationEventMulticaster这么一个玩意代表的就是事件多播器。那么问题来了,我们是从哪获取到的事件多播器的呢?下面我就要为大家揭晓谜团了,给大家说一下它是怎么拿到的。
首先,创建IOC容器。我们知道,在创建容器的过程中,还会调用一个refresh方法来刷新容器,如下图所示。
initApplicationEventMulticaster
然后,我们就要来看看这个refresh方法具体都做了哪些事。该方法我们已经很熟悉了,如下图所示,可以看到在该方法中会调非常多的方法,其中就有一个叫initApplicationEventMulticaster的方法,顾名思义,它就是来初始化ApplicationEventMulticaster的。而且,它还是在初始化创建其他组件之前调用的。
那么,初始化ApplicationEventMulticaster的逻辑又是怎样的呢?我们也可以来看一看,进入initApplicationEventMulticaster方法里面,如下图所示。
上述这个方法,你能看得懂吗?
其实很简单,它就是先判断IOC容器(也就是BeanFactory)中是否有id等于常量applicationEventMulticaster【APPLICATION_EVENT_MULTICASTER_BEAN_NAME】的组件
如果IOC容器中有id等于applicationEventMulticaster的组件,那么就会通过getBean方法直接拿到这个组件;其实说白了,在整个事件派发的过程中,我们可以自定义事件多播器。 如果没有,那么就重新new一个SimpleApplicationEventMulticaster类型的事件多播器兜底,然后再把这个事件多播器注册到容器中,也就是说,这相当于我们自己给容器中注册了一个事件多播器,这样,以后我们就可以在其他组件要派发事件的时候,自动注入这个事件多播器就行了。
你知道容器是怎么将监听器注册到事件多播器中去的吗?
getApplicationListeners
还记得我们在分析事件发布流程时,有一个叫multicastEvent#getApplicationListeners
的方法吗?
通过该方法就能知道容器中有哪些监听器。
registerListener
那么问题来了,容器中到底有哪些监听器呢?
其实,这个问题的答案很简单,因为我们把监听器早就已经添加到了容器中,所以,容器只需要判断一下哪些组件是监听器就行了。我为什么会这么说呢?这就得分析源码才能得出了。
首先,依旧还是创建IOC容器。我们也知道,在创建容器的过程中,还会调用一个refresh方法来刷新容器,如下图所示。
然后,我们就要来看看这个refresh方法具体都做了哪些事。该方法我们已经超熟悉了,如下图所示,可以看到在该方法中会调非常多的方法,其中就有一个叫registerListeners的方法,顾名思义,它就是来注册监听器的。
那到底是怎么来注册监听器的呢?我们可以点进去该方法里面看一看,如下图所示,可以看到它是先从容器中拿到所有的监听器,然后再把它们注册到applicationEventMulticaster当中。
当然了,第一次调用该方法时,getApplicationListeners方法是获取不到容器中所有的监听器的,因为这些监听器还没注册到容器中,不知道我这样理解的对不对,如果我要是理解的不对,那么还请读者指出,我再来修改,哈哈哈😁
所以,第一次调用该方法时,它会调用getBeanNamesForType方法从容器中拿到所有ApplicationListener类型的组件(即监听器),然后再把这些组件注册到事件派发器中。
这样,事件派发器里面就有这些监听器了,容器中到底有哪些监听器我们自然也就知道了。
接下来,就不用我说了吧!自然是事件派发器向各个监听器派发事件了。