1、最通俗的理解:
spring ioc容器applicationContext它有一个组件叫事件多播器(ApplicationEventMulticaster),多播器是一堆监听者(applicationListener)的容器,applicationContext执行publishEvent()方法发布一个事件,它会主动for循环遍历多播器中的监听者来执行监听者的回调方法。
2、spring中会出现哪些事件:
1)spring ioc容器刷新完成时,会发布ContextRefreshedEvent事件
2)进程运行中,程序员的自定义方法里通过applicationContext发布事件
3)spring ioc容器关闭会发布ContextClosedEvent
3、使用spring监听机制步骤:
1)写监听器
方法1:
写一个监听器(ApplicationListener实现类)来监听某种事件(ApplicationEvent及其子类)
方发2:
@EventListener;
原理:使用EventListenerMethodProcessor处理器来解析方法上的@EventListener,如果一个组件包含一个@EventListener方法,则这个组件就是监听器。
2)把监听器加入到容器;
3)只要ioc容器中有相关事件的发布,我们就能监听到这个事件
例如一些ioc容器的系统事件:
ContextRefreshedEvent事件:容器刷新完成(所有bean都完全创建)会发布这个事件
ContextClosedEvent事件:关闭容器会发布这个事件
于是,相应监听器的回调方法就会执行。
4)spring ioc容器如何发布一个事件:
applicationContext.publishEvent(事件)
4、事件发布后(即执行publishEvent()方法),会发生什么:
3)publishEvent(new ContextRefreshedEvent(this));
a)获取事件的多播器(派发器):getApplicationEventMulticaster()
b)多播器调用multicastEvent( )派发事件:
c)multicastEvent( )的伪代码逻辑:
//获取到所有订阅此事件的ApplicationListener;
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
/*
a)如果有Executor,可以支持使用Executor进行异步派发;
Executor executor = getTaskExecutor();
b)否则,同步的方式直接执行listener方法:
invokeListener(listener, event),拿到listener回调onApplicationEvent( )方法;
*/
}
相关源码:
5、事件多播器(派发器)什么时候诞生
1)ioc容器创建对象:进入refresh()方法
2)refresh()中的initApplicationEventMulticaster(),这里即是初始化ApplicationEventMulticaster组件
a)先去容器中找有没有id=[ applicationEventMulticaster ]的组件,存在则什么都不做。
b)如果没有则执行this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory),并且通过beanFactory.registerSingleton(String beanName, Object singletonObject)方法将事件多播器加入到ioc容器中。
6、监听器在什么时候被保存到事件多播器
1)容器创建对象:进入refresh();
2)refresh()中的registerListeners();
简约代码:
//从容器中拿到所有的监听器,把他们注册到[ applicationEventMulticaster ]中;
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
//将listener注册到ApplicationEventMulticaster中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);