Spring容器启动过程中发布的核心事件及事件处理机制详解

ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口提供的。如果将实现一个Bean实现了ApplicationListener接口,那么每当ApplicationEvent发布到ApplicationContext时,就会通知该bean。本质上,这是标准的观察者设计模式。,到Spring 4.2为止,事件基础设施得到了显著改进,提供了基于注释的模型以及发布任意事件的能力(也就是说,不一定是从ApplicationEvent扩展的对象)。当这样的对象被发布时,我们将它包装在一个事件中。,下表列出了Spring提供的标准事件:,以上事件发布时机:,该事件与上面的started是对应的,你还可以创建和发布自己的自定义事件。下面的例子展示了一个简单的类,它扩展了Spring的ApplicationEvent基类:,要发布自定义的ApplicationEvent,需要调用ApplicationEventPublisher的publishEvent()方法。通常,这是通过创建一个实现ApplicationEventPublisherAware的类并将其注册为Spring bean来完成的。下面的例子展示了这样一个类:,在配置时,Spring容器检测到EmailService实现了ApplicationEventPublisherAware,并自动调用
setApplicationEventPublisher()。实际上,传入的参数是Spring容器本身。通过ApplicationEventPublisher接口与应用程序上下文进行交互。,要接收自定义的ApplicationEvent,可以创建一个实现ApplicationListener的类,并将其注册为Spring bean。下面的例子展示了这样一个类:,请注意,ApplicationListener通常参数化为自定义事件的类型。这意味着onApplicationEvent()方法可以保持类型安全,避免任何向下转换的需要。你可以注册任意数量的事件监听器,但请注意,默认情况下,事件监听器是同步接收事件的。这意味着publishEvent()方法会阻塞,直到所有监听器都完成事件处理。这种同步和单线程方法的一个优点是,当侦听器接收到事件时,如果事务上下文可用,它将在发布者的事务上下文内操作。,可以使用@EventListener注解在托管bean的任何方法上注册事件监听器。可以将BlockedListNotifier重写为:,同时监听多个事件,如果希望特定的监听器异步处理事件,可以重用常规的@Async支持。如下面的例子所示:,在使用异步事件时,请注意以下限制:,如果需要在调用另一个监听器之前调用一个监听器,可以在方法声明中添加@Order注解,如下面的例子所示:,你还可以使用泛型来进一步定义事件的结构。考虑使用EntityCreatedEvent<T>,其中T是实际创建的实体的类型。例如,你可以创建以下监听器定义,只接收Person的EntityCreatedEvent:,由于类型擦除,只有当触发的事件解析了事件监听器过滤的泛型参数(即类似于PersonCreatedEvent类扩展EntityCreatedEvent<Person>{…})时,才会起作用。,方式1:ApplicationEventPublisher,AbstractApplicationContext实现了ApplicationEventPublisher接口,那么只要ApplicationContext继承自AbstractApplicationContext都可以直接发布事件:,方式2:通过@EventListener注解,该注解是由EventListenerMethodProcessor处理器处理的。,

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/20350.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34