Spring 框架笔记—4.16.2 标准与自定义事件
Event handling in the
ApplicationContext is provided through the
ApplicationEvent class and
ApplicationListener interface. If a bean that implements the
ApplicationListener interface is deployed into the context, every time an
ApplicationEvent gets published to the
ApplicationContext, that bean is notified. Essentially, this is the standard Observer design pattern. Spring 内置提供的标准事件包括:
ContextRefreshedEvent
Published when the
ApplicationContext is initialized or refreshed, for example, using the refresh() method on the
ConfigurableApplicationContext interface. "Initialized" here means that all beans are loaded, post-processor beans are detected and activated, singletons are pre-instantiated, and the ApplicationContext object is ready for use. As long as the context has not been closed, a refresh can be triggered multiple times, provided that the chosen ApplicationContext actually supports such "hot" refreshes. For example, XmlWebApplicationContext supports hot refreshes, but GenericApplicationContext does not.
ContextStartedEvent
Published when the ApplicationContext is started, using the start() method on the ConfigurableApplicationContext interface. "Started" here means that all Lifecycle beans receive an explicit start signal. Typically this signal is used to restart beans after an explicit stop, but it may also be used to start components that have not been configured for autostart , for example, components that have not already started on initialization.
ContextStoppedEvent
Published when the ApplicationContext is stopped, using the stop() method on the ConfigurableApplicationContext interface. "Stopped" here means that all Lifecycle beans receive an explicit stop signal. A stopped context may be restarted through a start() call.
ContextClosedEvent
Published when the ApplicationContext is closed, using the close() method on the ConfigurableApplicationContext interface. "Closed" here means that all singleton beans are destroyed. A closed context reaches its end of life; it cannot be refreshed or restarted.
RequestHandledEvent
A web-specific event telling all beans that an HTTP request has been serviced. This event is published after the request is complete. This event is only applicable to web applications using Spring’s DispatcherServlet.
创建自己的事件只需要继承ApplicationEvent类,如下所示:
public class BlackListEvent extends ApplicationEvent {
private final String address;
private final String test;
public BlackListEvent(Object source, String address, String test) {
super(source);
this.address = address;
this.test = test;
}
// accessor and other methods...
}
如果我们要发布上述事件,我们需要调用
ApplicationEventPublisher接口的publishEvent()方法,通常我们可以创建一个类实现ApplicationEventPublisherAware接口,并将它注册为Bean.示例如下:
public class EmailService implements ApplicationEventPublisherAware {
private List<String> blackList;
private ApplicationEventPublisher publisher;
public void setBlackList(List<String> blackList) {
this.blackList = blackList;
}
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public void sendEmail(String address, String text) {
if (blackList.contains(address)) {
BlackListEvent event = new BlackListEvent(this, address, text);
publisher.publishEvent(event);
return;
}
// send email...
}
}
在配置时,Spring容器会探测到EmailService 实现了ApplicationEventPublisherAware接口并自动的调用setApplicationEventPublisher()方法。实际上这个方法的参数就是Spring容器本身;通过ApplicationEventPublisher 接口与我们便可以与应用程序上下文进行交互。
如果要消费这个事件,则需要编写一个类实现ApplicationListener 接口并将之注册为Spring 的bean.以下示例阐述了这一点。
public class BlackListNotifier implements ApplicationListener<BlackListEvent> {
private String notificationAddress;
public void setNotificationAddress(String notificationAddress) {
this.notificationAddress = notificationAddress;
}
public void onApplicationEvent(BlackListEvent event) {
// notify appropriate parties via notificationAddress...
}
}
Notice that ApplicationListener is generically parameterized with the type of your custom event, BlackListEvent. This means that the onApplicationEvent() method can remain type-safe, avoiding any need for downcasting.
You may register as many event listeners as you wish, 需要注意的一点是所有事件监听都是同步的接收事件.这就表示 publishEvent() 方法被阻塞直到所有监听器完成事件处理. 这种同步和单线程方式的一个优点是,当监听器接收到事件时,如果发现事务上下文可用,那么它将在发布服务者的事务上下文中操作。如果我们想要定制事件发布的一些策略,可了解Spring的ApplicationEventMulticaster接口。
分享到:
相关推荐
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中
勇敢:核心图书馆 io.zipkin.brave/brave/4.16.2/brave-4.16.2.jar
ant-design,一套企业级 UI 设计语言和 React 组件库 提炼自企业级中后台产品的交互语言和视觉风格 开箱即用的高质量 React 组件
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中
Website Auditor for Mac是Mac OS上一款SEO优化软件,能够查看对手在搜索引擎上的排名情况,并为你提供一些优化报告和建议,快来下载体验吧。 软件介绍 WebSite Auditor是一个必须具有的onpage优化工具,网站管理员...
这通常涉及到处理`multipart/form-data`类型的请求,可以使用Spring的`MultipartFile`或Apache Commons FileUpload等库。 - 接收到文件后,需要进行一些验证,比如检查文件类型、大小等,确保上传的安全性。 - ...
4K视频下载http://www.4kgood.com,4K Video Downloader For mac 是一款视频下载器,视频网站下载高清视频及字幕,也可以下载的整个播放列表或者下载订阅频道,可以选择下载视频的清晰度(分辨率)及格式。
4. 软件框架 3 4.1模块描述 3 4.2软件架构 4 4.3模块加载机制 5 4.4应用(Applications) 6 4.4.1电话生命周期 6 4.4.2 mod_conference模块 8 4.4.3 mod_voicemail模块 14 4.4.4 mod_commands 14 4.4.5 mod_dptools 17...
对于无障碍访问的支持也是其亮点之一,符合WCAG 2.0标准,确保残障人士也能顺畅使用。 在性能优化上,CKEditor 4.11.2对内存管理和渲染速度进行了优化,保证了在大量文本编辑和复杂操作下的流畅性。同时,该版本还...
与简单的textarea输入框相比,富文本编辑器提供了更丰富的功能,如字体选择、字号调整、颜色设置、对齐方式、插入图片、链接创建、列表样式等,极大地提升了用户在网页上的内容创作体验。 在实现富文本编辑器的过程...
Webpack 4.16.2 是一款流行的前端模块打包工具,用于将JavaScript、CSS、图片等资源合并成可部署的静态文件。在这个特定的配置中,我们关注的是如何搭建一个支持开发环境和生产环境的基础环境。以下是关于这个配置的...
综上所述,ONVIF 2.0协议为网络视频监控系统提供了一个全面而细致的标准化框架,不仅规范了设备间的通信方式,还为实现设备间的互操作性奠定了坚实的基础。这对于促进视频监控行业的健康发展具有重要意义。
利用jsp实现ckeditor_3_6_2 上传图片功能,里面包含完整的工程,不过需要自己引入commons-fileupload-1.2.1.jar,commons-io-1.4.jar文件上传包,网上一大把。只要能正确引入,该工程就能完成
《CKEditor 4.6.2 全功能版本:深入解析图片上传功能的配置与实现》 CKEditor,作为一款广泛使用的开源富文本编辑器,以其强大的功能和易用性深受开发者喜爱。在CKEditor 4.6.2 Full版本中,它提供了完整的功能集,...
- **4.10 事件处理**:概述了事件检测和响应机制。 - **4.11 PTZ控制**:详细介绍了云台/镜头/变焦(Pan/Tilt/Zoom)的控制方法。 - **4.12 视频分析**:探讨了视频内容分析的技术原理和应用案例。 - **4.13 分析...
【4.16.2实验室安全流程与制度】是评审的重要部分,强调了实验室必须具备完善的制度和操作流程,并确保这些规则得到遵循和记录。具体包括: - 实验室安全责任人,通常是检验科主任,负责全面的安全管理工作。 - 安全...