服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

spring中事件处理的小技巧

spring中提供一些aware相关的接口,beanfactoryaware、 applicationcontextaware、resourceloaderaware、servletcontextaware等等,其中最常用到的是applicationcontextaware。
实现applicationcontextaware的bean,在bean被初始后,将会被注入 applicationcontext的实例。applicationcontextaware提供了publishevent()方法,实现observer(观察者)设计模式的事件传播机,提供了针对bean的事件传播功能。通过application.publishevent方法,我们可以将事件通知系统内所有的applicationlistener。

  spring事件处理一般过程:

  ?定义event类,继承org.springframework.context.applicationevent.

  ?编写发布事件类publisher,实现org.springframework.context.applicationcontextaware接口.

  ?覆盖方法setapplicationcontext(applicationcontext applicationcontext)和发布方法publish(object obj)

  ?定义时间监听类eventlistener,实现applicationlistener接口,实现方法onapplicationevent(applicationevent event).

  java 代码

import org.springframework.context.applicationevent;

/**
* 定义事件信息
* @author new
*
*/
public class messageevent extends applicationevent {

 private string message;

 public void setmessage(string message){
  this.message = message;
 }

 public string getmessage(){
  return message;
 }

 public messageevent(object source, string message) {
  super(source);
  this.message = message;
  // todo auto-generated constructor stub
 }

 private static final long serialversionuid = 1l;
}

  java 代码

import org.springframework.beans.beansexception;
import org.springframework.context.applicationcontext;
import org.springframework.context.applicationcontextaware;
import org.springframework.context.support.filesystemxmlapplicationcontext;

public class publisher implements applicationcontextaware {

 private applicationcontext context;

 @override
 public void setapplicationcontext(applicationcontext arg0)
 throws beansexception {
  // todo auto-generated method stub
  this.context = arg0;
 }

 public void publish(string message){
  context.publishevent(new messageevent(this,message));
 }

 public static void main(string[] args) {
  applicationcontext ctx = new filesystemxmlapplicationcontext("src/applicationcontext.xml");
  publisher pub = (publisher) ctx.getbean("publisher");
  pub.publish("hello world!");
  pub.publish("the quick brown fox jumped over the lazy dog");
 }
}

  java 代码

import org.springframework.context.applicationevent;
import org.springframework.context.applicationlistener;

public class messageeventlistener implements applicationlistener {

 @override
 public void onapplicationevent(applicationevent event) {
  // todo auto-generated method stub
  if(event instanceof messageevent){
   messageevent msevent = (messageevent)event;
   system.out.println("received: " + msevent.getmessage());
  }
 }
}

  在运行期,applicationcontext会自动在当前的所有bean中寻找applicationlistener接口的实现,并将其作为事件接收对象。当application.publishevent方法调用时,所有的applicationlistener接口实现都会被激发,每个applicationlistener可根据事件的类型判断是否是自己需要处理的事件,如上面的actionlistener只处理actionevent事件。

扫描关注微信公众号