spring中的事件发布框架依赖于三个抽象,ApplicationEvent,ApplicationListener,ApplicationEventPublisher。ApplicationEventPublisher的实现类依赖于AbstractApplicationContext,当中又依赖于ApplicationEventMulticast,其发布事件依赖于是否有设置事件监听器执行器,如果有设置,执行事件监听器就异步的,否则就是同步的。
1、接口设计
2、启动
(1)在调用invokeBeanFactoryPostProcessors时,EventListenerMethodProcessor会获取容器中所有的EventListenerFactory类。
(2)在initApplicationEventMulticaster中初始化SimpleApplicationEventMulticaster。
(3)在registerListeners中,向eventMulticaster中添加静态指定的监听器,以及添加容器中类型为ApplicationListenere的实例,同时如果有需要早期发布的事件,则会发布事件。
(4)在finishBeanFactoryInitialization中,非懒初始化容器中的对象实例时,如果实例类型是SmartInitializingSingleton,比如EventListenerMethodProcessor,会提取有@EventListenere的方法,作为监听器添加到eventMulticaster中
(5)在finishRefresh中,会发布ContextRefreshEvent事件
3、发布事件
(1)发布事件时,会获取当前的 taskExecutor。
(2)获取对应事件及事件类型的Listeners
(3)如果设置了taskExecutor,则异步执行invokeListener,会触发事件监听器的执行。如果出现异常,则执行ErrorHandler。
(4)没有设置taskExecutor,则同步执行invokeListener,触发事件监听器的执行,异常时执行ErrorHandler.