Spring笔记之四(Spring Event)

转贴处 http://www.blogjava.net/improviser/archive/2007/09/24/147914.html

Spring中提供一些Aware相关的接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到的是ApplicationContextAware。实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入 ApplicationContext的实例。ApplicationContextAware提供了publishEvent()方法,实现Observer(观察者)设计模式的事件传播机,提供了针对Bean的事件传播功能。通过Application.publishEvent方法,我们可以将事件通知系统内所有的ApplicationListener。

Spring事件处理一般过程:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1publicclassMessageEventextendsApplicationEvent{
2/**
3*
4*/
5privatestaticfinallongserialVersionUID=1L;
6privateStringmsg;
7publicMessageEvent(Objectsource,Stringmsg){
8super(source);
9this.msg=msg;
10}
11
12publicStringgetMessage(){
13returnmsg;
14}
15
}




<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 publicclassPublisherimplementsApplicationContextAware{
2
3privateApplicationContextctx;
4
5publicvoidsetApplicationContext(ApplicationContextapplicationContext)
6throwsBeansException{
7this.ctx=applicationContext;
8
9}
10
11publicvoidpublish(Stringmessage){
12ctx.publishEvent(newMessageEvent(this,message));
13}
14
15publicstaticvoidmain(String[]args){
16ApplicationContextctx=newFileSystemXmlApplicationContext(
17"src/applicationContext.xml");
18
19Publisherpub=(Publisher)ctx.getBean("publisher");
20pub.publish("HelloWorld!");
21pub.publish("Thequickbrownfoxjumpedoverthelazydog");
22}
23
24}



<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1publicclassMessageEventListenerimplementsApplicationListener{
2
3publicvoidonApplicationEvent(ApplicationEventevent){
4if(eventinstanceofMessageEvent){
5MessageEventmsgEvt=(MessageEvent)event;
6System.out.println("Received:"+msgEvt.getMessage());
7}
8}
9}


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

定义Event类,继承org.springframework.context.ApplicationEvent.

编写发布事件类Publisher,实现org.springframework.context.ApplicationContextAware接口.

覆盖方法setApplicationContext(ApplicationContextapplicationContext)和发布方法publish(Object obj)

定义时间监听类EventListener,实现ApplicationListener接口,实现方法onApplicationEvent(ApplicationEventevent).

你可能感兴趣的:(spring笔记)