Spring事件监听器源码
2019-08-16 12:18:37来源:博客园 阅读 ()
Spring事件监听器源码
Spring 自定义了继承 JDK 事件监听器的接口ApplicationListener<E extends ApplicationEvent> extends EventListener
,用来监听 Spring 应用程序中的事件;自定义了继承 JDK 事件对象的抽象类ApplicationEvent extends EventObject
,用来表示 Spring 应用程序中的事件类型。容器启动刷新过程中,可以定义事件监听器,来监听应用程序上下文事件ApplicationContextEvent extends ApplicationEvent
,它有四个具体的实现类:
ContextStartedEvent/ContextRefreshedEvent/ContextStoppedEvent/ContextClosedEvent
,分别表示容器启动/刷新/停止/关闭的事件。
通常有两种方式来实现 Spring 中的事件监听:
1.实现 ApplicationListener 接口
public class MyListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("MyListener: " + event);
}
}
2.使用 @EventListener 注解
public class MyAnnotationListener {
@EventListener(classes = ApplicationEvent.class)
public void listen(ApplicationEvent event) {
System.out.println("@EventListener:" + event);
}
}
3.自定义发布事件
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Test.class);
// 发布事件
context.publishEvent(new ApplicationEvent("my event") {});
}
}
原理
在 Spring 容器启动,调用 refresh() 刷新的过程中,会初始化事件派发器,并注册事件监听器,最后通过事件派发器,将事件发布给自己的监听器。
1 初始化事件派发器
initApplicationEventMulticaster();
为容器中的 BeanFactory 初始化一个事件派发器 (ApplicationEventMulticaster) :SimpleApplicationEventMulticaster,并注册到 BeanFactory,name 为 applicationEventMulticaster。
2 添加 ApplicationListener 监听器
registerListeners();
取出 BeanFactory 中 ApplicationListener 类型的事件监听器,全部添加到上面的事件派发器的缓存中。
3 添加 @EventListener 监听器
finishBeanFactoryInitialization(beanFactory)
从 Spring 后置处理器源码 可知,Spring 初始化时会注册 EventListenerMethodProcessor 和 DefaultEventListenerFactory。
EventListenerMethodProcessor 实现了 EventListenerMethodProcessor,所以执行 BeanFactory 后置处理器时,会调用 postProcessBeanFactory(),将 DefaultEventListenerFactory 添加到缓存中。
EventListenerMethodProcessor 实现了 SmartInitializingSingleton,所以在初始化剩余的单例 Bean 之后,会调用 afterSingletonsInstantiated(),获取所有的 BeanFactory,找到其中标注了 @EventListener 的方法,利用反射和 DefaultEventListenerFactory 为其创建 ApplicationListener,并添加到事件派发器的缓存中。
4 发布事件
finishRefresh();
- 初始化生命周期处理器,注册到 BeanFactory,name 为 lifecycleProcessor。
- 调用生命周期处理器的 onRefresh(),表示刷新状态。
- 发布上下文刷新事件。调用事件派发器的 multicastEvent() 进行派发,最终,通过回调事件监听器的 onApplicationEvent() 方法,来通知监听器。
异步派发和异常处理器
- 如果事件派发器设置了 Executor,则可以进行异步多线程的事件派发。
- 如果事件派发器设置了 ErrorHandler,则可以用异常处理器来处理异常。
原文链接:https://www.cnblogs.com/bigshark/p/11331245.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash