一、ApplicationListener
应用监听器
通过监听容器中发布的事件,事件驱动模型开发。监听ApplicationEvent
及其下面的子事件
当容器中发布此事件之后,onApplicationEvent()
方法会被触发
二、基于事件开发的步骤
写一个监听器实现ApplicationListener
接口来监听某个事件,并把监听器加入到容器中,只要容器中有相关事件的发布,就可以监听到这个事件
调用publishEvent()
方法发布事件
测试
三、监听器原理
ContextRefreshedEvent
事件
首先创建容器对象,调用refresh()
方法刷新容器
容器刷新的最后一步,调用finishRefresh()
方法
容器刷新完成,调用finishRefresh()
方法里面的publishEvent()
方法来发布ContextRefreshedEvent
容器刷新完成的事件
事件发布的流程如下:
首先调用getApplicationEventMulticaster()
方法获取事件的多播器(派发器),发送给多个监听器,让他们能够同时感知到这个事件
然后调用multicastEvent()
方法,获取所有的监听器,遍历执行监听器的方法。如果获取到Executor
就可以使用Executor
进行异步派发,否则同步的方式执行invokeListener()
方法
invokeListener()
方法进一步调用doInvokeListener()
方法
回调当前监听器的onApplicationEvent(event)
触发自定义的onApplicationEvent()
方法
打印收到的容器刷新完成的事件
自定义的发布事件
执行完容器刷新的事件,程序执行到了自定义的发布事件,然后打印publishEvent()
方法执行与上述相同的流程
打印收到的自定义发布的事件
ContextClosedEvent
事件
最后程序执行到容器关闭流程
close()
方法进一步调用doClose()
方法
doClose()
方法会调用publishEvent()
方法发布容器关闭的事件
事件的发布流程与上述一致
最后打印收到的容器关闭事件
三、事件多播器(派发器)
容器创建对象时,会调用refresh()
方法刷新容器。refresh()方法中会调用initApplicationEventMulticaster()
初始化ApplicationEventMulticaster
initApplicationEventMulticaster()
会先去容器中找id
为applicationEventMulticaster
的组件,如果找到就获取这个组件,如果没有找到就会创建一个SimpleApplicationEventMulticaster
类型的多播器并注册到容器中,这样在其它组件需要派发事件时,会自动注入这个创建的applicationEventMulticaster
四、获取容器中监听器
在refresh()
方法中会调用registerListeners()
方法注册监听器
registerListeners()
方法从容器中获取所有的监听器并添加到多播器中