转载来源 http://wenku.baidu.com/view/8b833790daef5ef7ba0d3c76.html
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()方法。由于Spring
IoC中的事件模型是一种简单的、粗粒度的监听模型,当有一个事件到达时,所有的监听器都会接收到,并且作出响应,如果希望只针对某些类型进行监听,需要在代码中进行控制。
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会逐个调用事件监听器。剩下要做的就是在配置文件中配置监听器。
<bean class="footprint.spring.ioc.event.UserListener"/>
Spring容器自身会发布一些事件,包括ContextClosedEvent、ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent。
分享到:
相关推荐
spring的Applicationcontext对事件的监听,在一个applicationContext范围内,实现类似MQ的效果
Spring中ApplicationContext对事件传递
Spring中ApplicationContext加载机制
Spring中ApplicationContext和beanfactory区别.rar
主要介绍了 Spring获取ApplicationContext对象工具类的实现方法的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
spring 获得applicationcontext公用方法
NULL 博文链接:https://ylxy3058.iteye.com/blog/2223687
Spring配置文件ApplicationContext,内容齐全,有需要的可以下载。
NULL 博文链接:https://canfly2010.iteye.com/blog/443063
Spring[applicationContext.xml]灵活性代理
《Spring的数据源配置文件模板》applicationContext.zip
spring定时任务必须的包和spring配置说明
spring4的“所有jar包”+applicationContext.xml+web.xml====全套
NULL 博文链接:https://mutourenoo.iteye.com/blog/1156865
Spring Web MVC开发 xml配置文件格式,无bean之类 Spring Web MVC开发配置文件 applicationContext
spring2.5的applicationContext配置文件.
这个工程主要实现了: Spring中Bean的生命周期 applicationcontext的应用(实现国际化,事件的传递)
今天小编就为大家分享一篇关于spring中通过ApplicationContext getBean获取注入对象的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
NULL 博文链接:https://dolphin-ygj.iteye.com/blog/368874