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;
案例
- 定义事件
|
|
- 定义监听器
|
|
- 测试
|
|