Spring--> ApplicationContext事件传播
2007-03-22 13:24
302 查看
事件传播
ApplicationContext基于Observer模式(java.util包中有对应实现),提供了针对Bean的事件传
播功能。通过Application. publishEvent方法,我们可以将事件通知系统内所有的
ApplicationListener。
事件传播的一个典型应用是,当Bean中的操作发生异常(如数据库连接失败),则通过事件传播
机制通知异常监听器进行处理。在笔者的一个项目中,就曾经借助事件机制,较好的实现了当系统
异常时在监视终端上报警,同时发送报警SMS至管理员手机的功能。
在目前版本的Spring中,事件传播部分的设计还有待改进。同时,如果能进一步支持异步事件处理
机制,无疑会更具吸引力。
下面是一个简单的示例,当LoginAction执行的时候,激发一个自定义消息“ActionEvent”,此
ActionEvent将由ActionListener捕获,并将事件内容打印到控制台。
LoginActoin.java:
public class LoginAction implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void setApplicationContext(
ApplicationContext applicationContext
)
throws BeansException {
this.applicationContext = applicationContext;
}
public int login(String username,String password) {
ActionEvent event = new ActionEvent(username);
this.applicationContext.publishEvent(event);
return 0;
}
}
ActionEvent.java:
public class ActionEvent extends ApplicationEvent {
public ActionEvent(Object source) {
super(source);
}
}
ActionListener.java:
public class ActionListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ActionEvent) {
System.out.println(event.toString());
}
}
}
配置非常简单:
<bean id="loginaction" class="net.xiaxin.beans.LoginAction"/>
<bean id="listener" class="net.xiaxin.beans.ActionListener"/>
运行测试代码:
ApplicationContext ctx=new
FileSystemXmlApplicationContext("bean.xml");
LoginAction action = (LoginAction)ctx.getBean("action");
action.login("Erica","mypass");
可以看到控制台输出:
net.xiaxin.beans.LoginEvent[source=Erica]
org.springframework.context.event.ApplicationEventMulticasterImpl实现了事件传播机
制,目前还相对简陋。
在运行期,ApplicationContext会自动在当前的所有Bean中寻找ApplicationListener接
口的实现,并将其作为事件接收对象。当Application. publishEvent方法调用时,所有的
ApplicationListener接口实现都会被激发,每个ApplicationListener可根据事
件的类型判断是否是自己需要处理的事件,如上面的ActionListener只处理
ActionEvent事件。
ApplicationContext基于Observer模式(java.util包中有对应实现),提供了针对Bean的事件传
播功能。通过Application. publishEvent方法,我们可以将事件通知系统内所有的
ApplicationListener。
事件传播的一个典型应用是,当Bean中的操作发生异常(如数据库连接失败),则通过事件传播
机制通知异常监听器进行处理。在笔者的一个项目中,就曾经借助事件机制,较好的实现了当系统
异常时在监视终端上报警,同时发送报警SMS至管理员手机的功能。
在目前版本的Spring中,事件传播部分的设计还有待改进。同时,如果能进一步支持异步事件处理
机制,无疑会更具吸引力。
下面是一个简单的示例,当LoginAction执行的时候,激发一个自定义消息“ActionEvent”,此
ActionEvent将由ActionListener捕获,并将事件内容打印到控制台。
LoginActoin.java:
public class LoginAction implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void setApplicationContext(
ApplicationContext applicationContext
)
throws BeansException {
this.applicationContext = applicationContext;
}
public int login(String username,String password) {
ActionEvent event = new ActionEvent(username);
this.applicationContext.publishEvent(event);
return 0;
}
}
ActionEvent.java:
public class ActionEvent extends ApplicationEvent {
public ActionEvent(Object source) {
super(source);
}
}
ActionListener.java:
public class ActionListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ActionEvent) {
System.out.println(event.toString());
}
}
}
配置非常简单:
<bean id="loginaction" class="net.xiaxin.beans.LoginAction"/>
<bean id="listener" class="net.xiaxin.beans.ActionListener"/>
运行测试代码:
ApplicationContext ctx=new
FileSystemXmlApplicationContext("bean.xml");
LoginAction action = (LoginAction)ctx.getBean("action");
action.login("Erica","mypass");
可以看到控制台输出:
net.xiaxin.beans.LoginEvent[source=Erica]
org.springframework.context.event.ApplicationEventMulticasterImpl实现了事件传播机
制,目前还相对简陋。
在运行期,ApplicationContext会自动在当前的所有Bean中寻找ApplicationListener接
口的实现,并将其作为事件接收对象。当Application. publishEvent方法调用时,所有的
ApplicationListener接口实现都会被激发,每个ApplicationListener可根据事
件的类型判断是否是自己需要处理的事件,如上面的ActionListener只处理
ActionEvent事件。
相关文章推荐
- Spring学习-webcontex的自动配置和事件传播机制及使用
- Spring中<ref local=""/>与<ref bean=""/>区别
- Spring的四种事务管理(一种编程式事务+三种声明事务)<学习随笔>
- 项目SpringMVC+Spring+Mybatis 整合环境搭建(2)-> 测试Spring+Mybatis 环境
- spring组件扫描<context:component-scan/>使用详解
- <WEB>平板_手机开发_13 个处理触摸事件和多点触摸的JS 库
- struts+spring+hibernate的web应用<一> 架构搭建
- jQuery练习1--给网页中所有的 &lt;p&gt; 元素添加 onclick 事件
- spring3 jsp页面使用<form:form modelAttribute="xxxx" action="xxxx">报错,附连接数据库的spring MVC annotation 案例
- <context:spring-configured/> 的作用
- 关于spring中<context:component-scan base-package="" />写法
- spring组件扫描<context:component-scan/>使用详解
- Spring <context:annotation-config/> 解说
- spring <bean scope="prototype">探讨
- 玩家角色Actor在玩游戏时通常会选用不同的装备Equip获得能力,在spring中完成Equip装备->Actor的注入
- [CTO札记]从文章->图->关键词,谈传播的有效形式
- <a>标签的点击事件
- struts-2.3.1+spring-framework-3.2.2+hibernate-4.1.1整合历程<第三部分>(详解)
- <iOS>响应事件传递, nextResponder研究
- Fragment进阶(五)----->监听fragment回退事件