ApplicationContext事件传播实际应用

事件传播
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,bean,.net,配置管理)