Spring入门学习——使用应用事件进行通信
2017-04-25 22:46
1701 查看
在组件之间的典型通信模式中,发送者必须定位接收者,以便调用接收者之上的方法。在这种情况下,发送者组件必须了解接收者组件。这种通信直接而简单,但是发送者和接收者组件紧密耦合。
Spring的应用上下文支持基于事件的Bean间通信。在基于事件的通信模式中,发送者组件只要发布一个事件而不需要知道接收者。实际上,可以有多于一个接收者组件。而且,接收者不需要知道是谁发布了事件,可以同时监听不同的发送者的多个事件。这样,发送者和接收者组件是低耦合的。
在Spring中,所有事件类都必须扩展ApplicationEvent类。这样,任何Bean都可以调用应用事件发布者的publishEvent()方法,从而发布一个事件。对于监听某些事件的Bean来说,必须实现ApplicationListener接口,并在onApplicationEvent()方法中处理事件。实际上,Spring将通知所有事件的监听者,必须过滤事件。但是如果使用类属,Spring将只发布匹配类属参数的消息。
在之前博客使用到的购物例子和收银员出账例子中进行学习,无关核心代码省略
定义事件:
发布事件:
代码中的
监听事件:
在定义事件,发布事件,监听事件后,还需要在应用上下文中注册监听器以监听所有事件。
除了我们自身定义的事件外,应用上下文本身也会发布容器事件。
Spring的应用上下文支持基于事件的Bean间通信。在基于事件的通信模式中,发送者组件只要发布一个事件而不需要知道接收者。实际上,可以有多于一个接收者组件。而且,接收者不需要知道是谁发布了事件,可以同时监听不同的发送者的多个事件。这样,发送者和接收者组件是低耦合的。
在Spring中,所有事件类都必须扩展ApplicationEvent类。这样,任何Bean都可以调用应用事件发布者的publishEvent()方法,从而发布一个事件。对于监听某些事件的Bean来说,必须实现ApplicationListener接口,并在onApplicationEvent()方法中处理事件。实际上,Spring将通知所有事件的监听者,必须过滤事件。但是如果使用类属,Spring将只发布匹配类属参数的消息。
在之前博客使用到的购物例子和收银员出账例子中进行学习,无关核心代码省略
定义事件:
package com.cgy.springrecipes.shop; import java.util.Date; import org.springframework.context.ApplicationEvent; public class CheckoutEvent extends ApplicationEvent { private double amount; private Date time; public CheckoutEvent(Object source, double amount, Date time) { super(source);// 要调用父类构造函数,否则报错 this.amount = amount; this.time = time; } public double getAmount() { return amount; } public Date getTime() { return time; } }
发布事件:
package com.cgy.springrecipes.shop; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Date; import java.util.Locale; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceAware; /** * 用于购物车中产品的结账 * 在一个文本文件中记录每次结账的时间和数量 */ public class Cashier implements StorageConfig,MessageSourceAware,ApplicationEventPublisherAware{ ...... private ApplicationEventPublisher applicationEventPublisher; public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } /** * @param cart 购物车 * @throws IOException */ public void checkout(ShoppingCart cart) throws IOException { ...... CheckoutEvent event = new CheckoutEvent(this,total,new Date()); applicationEventPublisher.publishEvent(event); } }
代码中的
ApplicationEventPublisherAware是之前学习过的“感知容器”接口中的其中一个。同时发布事件类中需要定义一个
ApplicationEventPublisher的引用,实现
ApplicationEventPublisherAware接口需要覆盖一个
setApplicationEventPublisher()方法
监听事件:
package com.cgy.springrecipes.shop; import java.util.Date; import org.springframework.context.ApplicationListener; public class CheckoutListener implements ApplicationListener<CheckoutEvent>{ public void onApplicationEvent(CheckoutEvent event) { double amount = ((CheckoutEvent)event).getAmount(); Date time = ((CheckoutEvent)event).getTime(); System.out.println("Checkout event["+amount+","+time+"]"); } }
在定义事件,发布事件,监听事件后,还需要在应用上下文中注册监听器以监听所有事件。
<bean class="com.cgy.springrecipes.shop.CheckoutListener"/>
除了我们自身定义的事件外,应用上下文本身也会发布容器事件。
相关文章推荐
- 学习《spring 3.x企业应用开发实战》之使用OXM进行对象XML映射
- SpringBoot入门学习一(如何使用IDEA创建一个SpringBoot应用)
- 使用Spring的AOP进行缓存在遭遇Hibernate应用时的注意点
- android学习进行时----1.1.2UI部分Button使用-事件监听
- 韩顺平_php从入门到精通_视频教程_第13讲_选择器使用细节_块元素和行内元素_盒子模型_盒子模型经典应用①_学习笔记_源代码图解_PPT文档整理
- 学习使用J2EE Web应用的事件功能
- SPRING.NET 1.3.2 学习21--使用对象或类的属性值进行注入
- SPRING.NET 1.3.2 学习23--使用方法的返回值进行注入
- 学习使用J2EE Web应用的事件功能
- Spring在Web应用中的事件与使用
- 案例学习BlazeDS+Spring之四InSync02使用RemoteObject事件
- 使用BIOS进行键盘输入和磁盘读写01 - 零基础入门学习汇编语言75
- SPRING.NET 1.3.2 学习2--快速入门应用示例说明
- 学习JavaFX Script,第三部分:使用JAX-WS进行客户端-服务器通信
- 使用JQuery进行WCF通信的学习记录
- 使用BIOS进行键盘输入和磁盘读写02 - 零基础入门学习汇编语言76
- 使用BIOS进行键盘输入和磁盘读写03 - 零基础入门学习汇编语言77(完)
- SPRING.NET 1.3.2 学习22--使用字段值进行注入
- linux学习入门8——使用fdisk进行磁盘管理(linuxcast.net)
- Android学习13--使用Intent和IntentFilter进行通信