博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 框架中注释驱动的事件监听器详解
阅读量:6705 次
发布时间:2019-06-25

本文共 3230 字,大约阅读时间需要 10 分钟。

 事件交互已经成为很多应用程序不可或缺的一部分,Spring框架提供了一个完整的基础设施来处理瞬时事件。下面我们来看看Spring 4.2框架中基于注释驱动的事件监听器。

1、早期的方式

在早期,组件要从Spring事件获知自定义域事件中获取通知,那么组件必须实现ApplicationListener接口并覆写onApplicationEvent方法。

@Componentclass OldWayBlogModifiedEventListener implements ApplicationListener
{ @Override public void onApplicationEvent(OldWayBlogModifiedEvent event) { externalNotificationSender.oldWayBlogModified(event); }}

 

上面的代码工作正常,但是它会针对每一个事件都创建一个新类,从而造成代码瓶颈。

另外,我们的事件类继承了ApplicationEvent类——Spring应用中的事件基类。

class OldWayBlogModifiedEvent extends ApplicationEvent {
public OldWayBlogModifiedEvent(Blog blog) { super(blog); } public Blog getBlog() { return (Blog)getSource(); }}

2、注释驱动的事件监听器

Spring 4.2框架值得注意的一点,用注释@EventListener注解任意的Spring组件。

@EventListenerpublic void blogModified(BlogModifiedEvent blogModifiedEvent) {    externalNotificationSender.blogModified(blogModifiedEvent);}

Spring会为事件创建一个ApplicationListener实例,并从方法参数中获取事件的类型。一个类中被事件注释的方法数量没有限制,所有相关的事件句柄都会分组到一个类中。

 

3、有条件的事件处理

为了使注释@EventListener的功能更强大,Spring 4.2支持用SpEL表达式表达事件类型的方式。假设以下是事件类:

public class BlogModifiedEvent {
private final Blog blog; private final boolean importantChange; public BlogModifiedEvent(Blog blog) { this(blog, false); } public BlogModifiedEvent(Blog blog, boolean importantChange) { this.blog = blog; this.importantChange = importantChange; } public Blog getBlog() { return blog; } public boolean isImportantChange() { return importantChange; }}

要注意,在实际应用中可能不会有本文这样的层次结构的事件。 

还要注意,用Groovy编写会更加简单。

使用条件参数来阐述事件,重要的变化是:

@EventListener(condition = "#blogModifiedEvent.importantChange")public void blogModifiedSpEL(BlogModifiedEvent blogModifiedEvent) {
externalNotificationSender.blogModifiedSpEL(blogModifiedEvent); }

4、宽松事件类型的层次结构

Spring 4.2之前的版本,ApplicationEventPublisher只有在ApplicationEvent事件后发布其继承对象的能力。而在Spring 4.2版开始,此接口已经扩展到支持任意对象类型。在这种情况下,对象被封装到PayloadApplicationEvent和通过发送。

//base class with Blog field - no need to extend `ApplicationEvent`class BaseBlogEvent {}class BlogModifiedEvent extends BaseBlogEvent {}//somewhere in the codeApplicationEventPublisher publisher = (...);    //injectedpublisher.publishEvent(new BlogModifiedEvent(blog)); //just plain instance of the event

这一变化使得发布事件更容易。然而另一方面它可以导致事件跟踪变得更加困难,特别是在大型应用程序中。

5、响应发布事件

注释@EventListener还有一点需注意,在非空返回类型时,Spring会自动发布返回的事件。

@EventListenerpublic BlogModifiedResponseEvent blogModifiedWithResponse(BlogModifiedEvent blogModifiedEvent) {
externalNotificationSender.blogModifiedWithResponse(blogModifiedEvent); return new BlogModifiedResponseEvent( blogModifiedEvent.getBlog(), BlogModifiedResponseEvent.Status.OK);}

6、异步事件处理

注释@EventListener还可以与注释@Async进行组合使用,以提供异步事件处理的机制。下面的代码中,指定的事件监听器既不会阻塞主要的代码执行,又不会被其它的监听器处理。

@Async    //Remember to enable asynchronous method execution           //in your application with @EnableAsync@EventListenerpublic void blogAddedAsync(BlogAddedEvent blogAddedEvent) {    externalNotificationSender.blogAdded(blogAddedEvent);}

为了使工作能够得到异步执行,通常还需在Spring项目的上下文中使用注释@EnableAsync。

  或者xml文件:

7、总结

注释驱动的事件监听器是Spring框架4.2版中引入的新特性,它减少了Spring项目的样板代码,使得代码更加灵活,尤其是在小数量事件的需求时体现更为明显。

转载于:https://www.cnblogs.com/ganbo/p/7818488.html

你可能感兴趣的文章
Cocos2d-x for Windows Phone 8 发布
查看>>
android调用系统电话薄,实现增删改查。
查看>>
Delphi多媒体设计之TMediaPlayer组件(七)
查看>>
生产者消费者问题理解与Java实现
查看>>
python之排序操作及heapq模块
查看>>
《设计模式》2.创建型模式
查看>>
针对于iosAPP内嵌H5,-webit-overflow-scrolling:touch;产生空白情况
查看>>
深入浅出JavaScript运行机制
查看>>
LeetCode 272 Closest Binary Tree Traversal II 解题思路
查看>>
html中表单提交
查看>>
video自动播放 隐藏播放控制条,并且用点击 video 元素的时候 控制暂停和播放...
查看>>
【go密码学】-数字签名
查看>>
代码重构之消除分支结构
查看>>
ingress controller学习记录
查看>>
328. Odd Even Linked List
查看>>
redis学习笔记(三)--Redis的功能
查看>>
NeurIPS 2018 中的贝叶斯研究
查看>>
Android 音视频入门之音频采集、编码、播放
查看>>
python并发模块之concurrent.futures(一)
查看>>
1月10日云栖精选夜读 | 12亿行代码,阿里巴巴这一年的技术报告和梦想报告 ...
查看>>