Spring中ApplicationContext对事件传递
2015-12-14 21:23
323 查看
ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的,通过ApplicationContext的publishEvent()方法发布到ApplicationListener;
在这里包含三个角色:被发布的事件,事件的监听者和事件发布者。
事件发布者在发布事件的时候通知事件的监听者。
下面我们围绕这三个角色进行分析:
首先是被发布的事件:在Spring中,这个角色继承了ApplicationEvent类。
再看监听者,监听者实现了ApplicationListener接口。
而事件的发布者则实现了ApplicationContextAware接口,并调用publishEvent方法发布事件。在这里,事件将作为参数传递到这个方法中。
ApplicationContext具有发布事件的能力。这是因为该接口继承了ApplicationEventPublisher接口。
Spring中与事件有关的接口和类主要包括ApplicationEvent、ApplicationListener。
定义一个事件的类需要继承ApplicationEvent或者ApplicationContextEvent抽象类,该抽象类中只有一个构造函数,
并且带有一个Object类型的参数作为事件源,并且该事件源不能为null,因此我们需要在自己的构造函数中执行super
(Object)。
针对一种事件,可能需要特定的监听器,因此,监听器需要实现ApplicationListener接口。当监听器接收到一个事件
的时候,就会执行它的 onApplicationEvent()方法。由于SpringIoC中的事件模型是一种简单的、粗粒度的监听模型
,当有一个事件到达时,所有的监听器都会接收到,并且作出响应,如果希望只针对某些类型进行监听,需要在代码中
进行控制。
对于发布事件,我们可以实现ApplicationContextAware或者ApplicationEventPublisherAware接口。
或者如下:
至此便完成了事件的发布,当ApplicationContext接收到事件后,事件的广播是Spring内部给我们做的,不需要了解具
体的细节。其实在Spring读取配置文件之后,利用反射,将所有实现ApplicationListener的Bean找出来,注册为容器
的事件监听器。当接收到事件的时候,Spring会逐个调用事件监听器。剩下要做的就是在配置文件中配置监听器。
Spring容器自身会发布一些事件,包括ContextClosedEvent、ContextRefreshedEvent、ContextStartedEvent、
ContextStoppedEvent。
在这里包含三个角色:被发布的事件,事件的监听者和事件发布者。
事件发布者在发布事件的时候通知事件的监听者。
下面我们围绕这三个角色进行分析:
首先是被发布的事件:在Spring中,这个角色继承了ApplicationEvent类。
再看监听者,监听者实现了ApplicationListener接口。
而事件的发布者则实现了ApplicationContextAware接口,并调用publishEvent方法发布事件。在这里,事件将作为参数传递到这个方法中。
ApplicationContext具有发布事件的能力。这是因为该接口继承了ApplicationEventPublisher接口。
Spring中与事件有关的接口和类主要包括ApplicationEvent、ApplicationListener。
定义一个事件的类需要继承ApplicationEvent或者ApplicationContextEvent抽象类,该抽象类中只有一个构造函数,
并且带有一个Object类型的参数作为事件源,并且该事件源不能为null,因此我们需要在自己的构造函数中执行super
(Object)。
public class UserEvent extends ApplicationEvent { private String eventContent; public String getEventContent(){ return eventContent; } public void setEventContent(String eventContent){ this.eventContent = eventContent; } public UserEvent(Object source,String eventContent){ super(source); this.eventContent = eventContent; } }
针对一种事件,可能需要特定的监听器,因此,监听器需要实现ApplicationListener接口。当监听器接收到一个事件
的时候,就会执行它的 onApplicationEvent()方法。由于SpringIoC中的事件模型是一种简单的、粗粒度的监听模型
,当有一个事件到达时,所有的监听器都会接收到,并且作出响应,如果希望只针对某些类型进行监听,需要在代码中
进行控制。
public class UserListener implements ApplicationListener { public void onApplicationEvent(ApplicationEvent event){ if(event instanceof UserEvent){ //只对UserEvent类型进行处理 UserEvent ue = (UserEvent)event; String result = ue.getEventContent(); System.out.println("Event Content:"+result); } } }
对于发布事件,我们可以实现ApplicationContextAware或者ApplicationEventPublisherAware接口。
public class UserBiz implements ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public void service(String thing) { UserEvent event = new UserEvent(this,thing); event.setEventContent("I shoud "+thing); applicationContext.publishEvent(event); } }
或者如下:
public class UserBiz2 implements ApplicationEventPublisherAware { private ApplicationEventPublisher applicationEventPublisher; public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } public void service(String thing) { UserEvent event = new UserEvent(this,thing); event.setEventContent("I shoud "+thing); applicationEventPublisher.publishEvent(event); } }
至此便完成了事件的发布,当ApplicationContext接收到事件后,事件的广播是Spring内部给我们做的,不需要了解具
体的细节。其实在Spring读取配置文件之后,利用反射,将所有实现ApplicationListener的Bean找出来,注册为容器
的事件监听器。当接收到事件的时候,Spring会逐个调用事件监听器。剩下要做的就是在配置文件中配置监听器。
class="footprint.spring.ioc.event.UserListener"/>
Spring容器自身会发布一些事件,包括ContextClosedEvent、ContextRefreshedEvent、ContextStartedEvent、
ContextStoppedEvent。
相关文章推荐
- android.content.res.Resources$NotFoundException:
- 不同APP通过SharedPreferences传递数据(共享数据)
- Application中的资源访问的三种方式
- Android内存泄露总结(一)
- Android:ListView 多布局,加头部,尾部
- 微信公众号开发JSSDK上传图片(多图上传)
- 自己动手写cocos2dx游戏引擎(二)——applicationDidFinishLaunching
- Android 中加密的String:让我们做出更少的失误
- 【Android 疑难杂症1】android.content.ActivityNotFoundException: Unable to find explicit activity class
- Android 设置ListView不可滚动 及在ScrollView中不可滚动的设置
- 修改微健身app的数据,来购买里面的课程
- swift学习日记(六) 方法
- Android:AutoCompleteTextView 随记
- Android Studio——Uri、UriMatcher、ContentUris详解
- Android:shape:表示一张图片
- swift !?
- Cocos3D专题课程源码地址
- Android:SystemClock 随记
- 使用vs调试unity脚本的方法
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解