Spring Application Event Example
Spring Application Event
项目结构
工程下载
https://github.com/xiaoheike/SpringApplicationEventExample.git
SportEvent
package nd.esp.com.event;
import org.springframework.context.ApplicationEvent;
public class SportEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
public SportEvent(Object source) {
super(source);
}
}
SportEvent
是所有体育运动的父类,继承Spring ApplicationEvent
,必须实现带参数构造函数,如上述代码所示。带参数构造函数传入参数可用于携带其他的信息。具体在NBAEvent
中可以看到作用。
NBAEvent
package nd.esp.com.event;
public class NBAEvent extends SportEvent {
private static final long serialVersionUID = 1L;
private String text;
public NBAEvent(Object source) {
super(source);
}
public NBAEvent(String source, String text) {
super(source);
this.text = text;
}
public String news() {
return text;
}
@Override
public String getSource() {
return String.class.cast(super.getSource());
}
}
NBAEvent
主题,用于显示NBA相关信息,上述getSource()
方法重写了Spring ApplicationEvent 的父类EventObject
,可以用于获得构造函数传入的参数。
SoccerEvent
package nd.esp.com.event;
public class SoccerEvent extends SportEvent {
private static final long serialVersionUID = 1L;
private String text;
public SoccerEvent(String source) {
super(source);
}
public SoccerEvent(Object source, String text) {
super(source);
this.text = text;
}
public String news() {
return text;
}
@Override
public String getSource() {
return String.class.cast(super.getSource());
}
}
SoccerEvent
主题,用于显示足球先关信息,和NBAEvent
功能类似。
SportEventListener
SportEventListener1
package nd.esp.com.listener;
import nd.esp.com.event.NBAEvent;
import nd.esp.com.event.SoccerEvent;
import nd.esp.com.event.SportEvent;
import org.springframework.context.ApplicationListener;
public class SportEventListener implements ApplicationListener<SportEvent> {
public void onApplicationEvent(SportEvent event) {
if (event instanceof NBAEvent) {
System.out.println("SportEventListener1:" + NBAEvent.class.cast(event).getSource());
}
if (event instanceof SoccerEvent) {
SoccerEvent soccerEvent = SoccerEvent.class.cast(event);
System.out.println("SportEventListener1:" + soccerEvent.getSource() + " " + soccerEvent.news());
}
}
}
SportEventListener2
package nd.esp.com.listener;
import nd.esp.com.event.NBAEvent;
import nd.esp.com.event.SoccerEvent;
import nd.esp.com.event.SportEvent;
import org.springframework.context.ApplicationListener;
public class SportEventListener2 implements ApplicationListener<SportEvent> {
public void onApplicationEvent(SportEvent event) {
if (event instanceof NBAEvent) {
System.out.println("SportEventListener2:" + NBAEvent.class.cast(event).getSource());
}
if (event instanceof SoccerEvent) {
SoccerEvent soccerEvent = SoccerEvent.class.cast(event);
System.out.println("SportEventListener2:" + soccerEvent.getSource() + " " + soccerEvent.news());
}
}
}
SportEventListener
是观察者,当有新事件到来会被调用。SportEvent
的功能在这里得到体现,通过创建父类,可以同时监控一类相似的主题,比如NBA事件以及足球事件。这样可以少些监听者。可以有多个观察者监听相同的时间,这里是指SportEvent。
SportEventPublisher
package nd.esp.com.publisher;
import nd.esp.com.event.NBAEvent;
import nd.esp.com.event.SoccerEvent;
import nd.esp.com.event.SportEvent;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SportEventPublisher implements ApplicationContextAware {
private ApplicationContext applicationEventPulisher = null;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationEventPulisher = applicationContext;
}
public void publishEvent(SportEvent sportEvent) {
applicationEventPulisher.publishEvent(sportEvent);
}
public static void main(String[] args) {
String[] xmlConfig = new String[] { "applicationContext.xml" };
// 使用ApplicationContext来初始化系统
ApplicationContext context = new ClassPathXmlApplicationContext(xmlConfig);
SportEventPublisher publisher = (SportEventPublisher) context.getBean("applicationContextAware");
publisher.publishEvent(new NBAEvent("NBA sport:骑士队获得总冠军"));
publisher.publishEvent(new SoccerEvent("Scorrer sport:标题:中国获得世界杯冠军", "中国击败世界各国,取得10连冠"));
}
}
SportEventPublisher
当有新的时间时,由它发布,这个类继承Spring ApplicationContextAware
,能够自动注入ApplicationContext
对象。这个类实现了主题的通知功能。
appicationContext.xml(单线程)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="applicationContextAware" class="nd.esp.com.publisher.SportEventPublisher"></bean>
<bean id="applicationListener1" class="nd.esp.com.listener.SportEventListener1"></bean>
<bean id="applicationListener2" class="nd.esp.com.listener.SportEventListener2"></bean>
</beans>
这两个bean是必须的,id可以任意,spring针对SportEventPublisher
肯定是有经过特殊处理的,要不然该类中的ApplicationEventPublisher
无法注入对应类。
这样的配置默认是采用单线程,为了提高效率可以使用多线程。修改application.xml
文件如下即可。
applicationContext.xml(多线程)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="applicationContextAware" class="nd.esp.com.publisher.SportEventPublisher"></bean>
<bean id="applicationListener1" class="nd.esp.com.listener.SportEventListener1"></bean>
<bean id="applicationListener2" class="nd.esp.com.listener.SportEventListener2"></bean>
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="keepAliveSeconds" value="30000" />
<property name="maxPoolSize" value="1000" />
<property name="queueCapacity" value="200" />
</bean>
<bean id="applicationEventMulticaster"
class="org.springframework.context.event.SimpleApplicationEventMulticaster">
<property name="taskExecutor" ref="taskExecutor" />
</bean>
</beans>
idapplicationEventMulticaster
不能够改变,猜测是spring需要根据这个id注入对象。
SimpleApplicationEventMulticaster
多线程或者单线程可以通过该类中的方法
@SuppressWarnings("unchecked")
public void multicastEvent(final ApplicationEvent event) {
for (final ApplicationListener listener : getApplicationListeners(event)) {
Executor executor = getTaskExecutor();
if (executor != null) {
executor.execute(new Runnable() {
public void run() {
listener.onApplicationEvent(event);
}
});
}
else {
listener.onApplicationEvent(event);
}
}
}
多线程产经下变量executor
的值不为空,单线程则相反。
运行结果##
教程结束,感谢阅读。
欢迎转载,但请注明本文链接,谢谢。
2016.5.12 17:49
Spring Application Event Example的更多相关文章
- Spring 事件:Application Event
Spring Application Event Spring 的事件(Application Event)为 Bean 与 Bean 之间的消息通信提供了支持.当一个 Bean 处理完一个任务之后, ...
- Spring Boot实战笔记(四)-- Spring常用配置(事件Application Event)
一.事件(Application Event) Spring的事件为Bean和Bean之间的消息通信提供了支持.当一个Bean处理完一个任务之后,希望另一个Bean知道并能做相应的处理,这时我们就需要 ...
- spring boot: 一般注入说明(五) @Component, application event事件为Bean与Bean之间通信提供了支持
spring的事件,为Bean与Bean之间通信提供了支持,当一个Bean处理完成之后,希望另一个Bean知道后做相应的事情,这时我们就让另外一个Bean监听当前Bean所发送的事件. spring的 ...
- 从命令模式的维度理解Spring 之Application Event
Spring的事件(Application Event)为Bean与Bean之间的信息通讯提供了支持.当一个Bean处理完一个任务之后,希望另一Bean指定并能做相应的处理,这时我们就需要让另外一个B ...
- Spring Session event事件分析
1. org.apache.catalina.session.StandardSession 这是servlet-api jar包中的一个类.是session接口的标准实现.当session创建的时候 ...
- SpringBoot -- 事件(Application Event)
Spring的事件为Bean与Bean之间的消息通信提供了支持,当一个Bean处理完一个任务之后,希望另外一个Bean知道并能做相应的处理,这时我们就需要让一个Bean监听当前Bean所发送的事件. ...
- spring 事件(Application Event)
spring 事件为bean 与 bean之间传递消息.一个bean处理完了希望其余一个接着处理.这时我们就需要其余的一个bean监听当前bean所发送的事件. spring事件使用步骤如下: 1.先 ...
- Spring应用事件(Application Event)
Spring的事件为Bean与Bean的消息通信提供的支持.当一个Bean处理完了一个任务以后,希望另一个Bean知道并能做出相应的处理,这是我们就需要让另一个Bean监听当前Bean所发送的事件. ...
- 事件(Application Event)
Spring的事件(Appllcation Event)为Bean与Bean之间的消息通信提供了支持.当一个Bean处理完一个任务后,希望另一个Bean知道并能做相应的处理,这种情况可以让另一个Bea ...
随机推荐
- Bootstrap<基础十四> 按钮下拉菜单
使用 Bootstrap class 向按钮添加下拉菜单.如需向按钮添加下拉菜单,只需要简单地在在一个 .btn-group 中放置按钮和下拉菜单即可.也可以使用 <span class=&qu ...
- js判断鼠标向上滚动并浮动导航
<div id="Jnav"> <ul class="nav"> <li><a href="#"& ...
- Windows下QT Creator工程中添加文件夹
在QT项目,常常会有很多头文件和源文件,但是QT Creator中却没有添加文件夹的功能,造成项目代码混乱. 下面是建立文件的步骤: 1.打开工程目录,在目录下建立文件夹,如建立文件SerialP ...
- Spring Security (一)
一.pom.xml <!-- spring security --> <dependency> <groupId>org.springframework.secur ...
- Swift函数
函数 函数 介绍 // func // 在Swift中,一个个的方法就是函数 // 1.定义函数的关键字是func // 在定义函数的时候,不管有没有参数都加括号,参数写在括号中 // 在定义函数时, ...
- tensor flow入门笔记
个人学习笔记,欢迎交流.
- js动画之获取元素属性
首先我们要介绍一些知识 offsetWidth element.offsetWidth = width + padding + border; width 我们也知道element.style.wid ...
- Sqrtx
我只能想出二分的方法,而且还不一定能写出最简洁的代码.无论刷多少遍,牛顿迭代法我都想不到,莫名有种悲哀的感觉:智力是硬伤啊.就算如此,却还要一遍遍不厌其烦地刷,这才是最悲剧的.多说无益,上代码. 二分 ...
- hdu 1231, dp ,maximum consecutive sum of integers, find the boundaries, possibly all negative, C++ 分类: hdoj 2015-07-12 03:24 87人阅读 评论(0) 收藏
the algorithm of three version below is essentially the same, namely, Kadane's algorithm, which is o ...
- Java中文件的随机读写
[例 10-12]模仿系统日志,将数据写入到文件尾部. //********** ep10_12.java ********** import java.io.*; class ep10_12{ pu ...