目录
ApplicationListener接口用来监听容器发布的事件,用来事件驱动模型开发。
在方法上使用@EventListener注解,作用与实现ApplicationListenr接口一致,都可用来监听事件。
1、创建容器时,调用refresh方法刷新容器,在refresh方法调用initApplicationEventMulticaster方法,创建applicationEventMulticaster应用事件多播器(派发器),事件多播器主要是在容器发布事件时,通过遍历保存在applicationEventMulticaster事件多播器的监听器集合,将事件发布到各个监听器中,

1.1、initApplicationEventMulticaster方法中判断容器是否有组件id为applicationEventMulticaster的事件多播器对象。若是没有,则默认创建类型为SimpleApplicationEventMulticaster的对象,并添加到容器的单实例集合中。我们可以创建自定义的事件多播器对象,并加入到容器的单实例集合中,

2、通过refresh方法的registerListeners方法注册监听器

2.1、registerListeners方法中,遍历容器已有的监听器集合,调用事件多播器的addApplicationListener方法将监听器对象添加到事件多播器的defaultRetriever.applicationListeners中,


3、遍历容器的beanDefinitions集合,将实现ApplicationListener接口的beanName添加到事件多播器的defaultRetriever.applicationListenerBeans中,


4、接着将早期存储的earlyEventsToProcess事件集合通过事件多播器的multicastEvent方法发布,将容器的earlyEventsToProcess设置为null,

4.1、查看multicastEvent方法,先调用getApplicationListeners方法获取可以监听该事件event的监听器集合,

4.1.1、在getApplicationListeners方法中,先判断事件多播器的retrieverCache缓存中是否可以找到该事件的监听器集合,若是找到,则直接返回缓存中的监听器集合,

4.1.2、若是找不到,则接着通过retrieveApplicationListeners方法找到监听该事件的监听器集合返回,
4.1.2.1、在retrieveApplicationListeners方法中,先遍历listeners(defaultRetriever.applicationListeners), 通过supportsEvent方法判断该监听器是否需要监听该事件,若需要,则加入到allListeners集合中,

4.1.2.2、listenerBeans集合若是不为空,接着遍历listenerBeans集合,判断allListeners集合是否包含该监听器对象。若是不包含,则通过supportsEvent方法判断监听器是否需要监听该事件,若是需要,则将其添加到allListeners集合, 最后返回allListeners集合。

4.2、遍历返回的监听器集合,判断事件多播器是否有Executor类型的异步对象。若是有,则通过异步对象异步运行invokeListener方法去运行监听器的onApplicationEvent方法或@EventListener标识的监听方法,若是没有,则同步运行监听器的invokeListener方法。
5、容器在refresh方法的prepareBeanFactory方法中添加了类型为ApplicationListenerDetector的后置处理器,


5.1、ApplicationListenerDetector后置处理器主要是用来探索实现ApplicationApplication接口的innerBean(普通bean也会被探索到)。
因为innerBean不能通过容器的getBeanNamesForType方法得到,所以在 (2.1节)容器的registerListener方法中无法将innerBean监听器添加到多播器中。
注册该后置处理器,在组件创建初始化完成后,调用postProcessAfterInitialization方法,将实现ApplicationListener接口的组件对象(包括innerBean对象)添加到监听器集合中,
6、容器通过preInstantiateSingletons方法,创建并初始化完所有非延迟加载的单实例组件对象,接着遍历容器的beanDefinitions集合,找到实现SmartInitializingSingleton接口的实现类对象,调用实现类对象的afterSingletonsInstantiated方法,

6.1、EventListenerMethodProcessor处理器实现SmarInitializingSingleton接口,该处理器主要是解析@EventListener注解,通过afterSingletonsInstantiated方法的processBean方法将标识该注解的方法封装成ApplicationListenerMethodAdapter的监听器对象并加入到多播器中,

7、 调用容器的publishEvent方法发布事件,在publishEvent方法中,通过事件多播器的multicastEvent方法进行发布,步骤跟(4节)一致。
