Spring 事件框架
Spring
事件框架包含三个部件:
- 事件:
ApplicationEvent
- 事件监听器:
ApplicationListener
,对监听到的事件进行处理 - 事件发布:
ApplicationEventPublisher
,ApplicationContext
继承了该接口,在ApplicationContext
的抽象实现类AbstractApplicationContext
中做了实现
Spring 事件原理
Spring提供的事件类型
ContextStartedEvent
:ApplicationContext
启动后触发的事件;ContextStoppedEvent
:ApplicationContext
停止后触发的事件;ContextRefreshedEvent
:ApplicationContext
初始化或刷新完成后触发的事件;(容器初始化完成后调用)ContextClosedEvent
:ApplicationContext
关闭后触发的事件;(如web容器关闭时自动会触发spring容器的关闭)
事件发布者
ApplicationContext
接口继承了ApplicationEventPublisher
,并在AbstractApplicationContext
实现了具体代码,实际执行是委托给ApplicationEventMulticaster
:
|
|
常用的ApplicationContext
都继承自AbstractApplicationContext
,如ClassPathXmlApplicationContext
、XmlWebApplicationContext
等,自动拥有这个功能
ApplicationEventMulticaster
初始化
|
|
Spring
容器初始化的时候会调用initApplicationEventMulticaster()
初始化 ApplicationEventMulticaster
,如果没有自定义的applicationEventMulticaster
则默认创建一个SimpleApplicationEventMulticaster
。
multicastEvent
发布事件
其中SimpleApplicationEventMulticaster
发布事件的代码如下:
|
|
如果给它一个executor
,它就可以异步支持发布事件了。
事件监听器
registerListeners
注册事件监听器
|
|
Spring
使用反射机制,通过方法getBeanNamesForType
获取所有实现了ApplicationListener
接口的Bean
,并调用addApplicationListenerBean
方法将其注册到applicationEventMulticaster
中。所以可以在Spring
配置文件中配置自定义监听器,在Spring
初始化的时候,会把监听器自动注册到注册表中去。
SmartApplicationListener
监听器
|
|
|
|
该接口可方便实现去判断支持的事件类型、目标类型。
supportsEventType
:用于指定支持的事件类型,只有支持的才调用onApplicationEvent
;supportsSourceType
:支持的目标类型,只有支持的才调用onApplicationEvent
;
案例
- 定义事件
|
|
- 定义监听器
|
|
- 测试
|
|