Spring中的ApplicationContext事件机制
Spring中的ApplicationContext事件机制
今天看到了ac.publishEvent(event)的写法,这个事件处理机制在学习中没有怎么去写,公司里面是用来处理与主程序无关的流程,这里想到了平时用的比较多的异步线程去处理的方式,今天来学习ApplicationContext事件机制.
理解
ApplicationContext的事件机制是观察者设计模式的实现,通过 ApplicationEvent 类和 ApplicationListener 接口,可以实现 Application Context 的事件处理。如果容器中有一个 ApplicationListener Bean 每当 ApplicationContext 发布 ApplicationEvent时,ApplicationListene r Bean将自动触发,主要有两个成员: ①ApplicationEvent: 容器事件 ②ApplicationListener: 监听器
下图简单示范了ApplicationContext事件

代码演示
程序先定义了一个ApplicationContext类,其对象就是一个Spring容器事件。代码如下:
import org.springframework.context.ApplicationEvent;
public class EmailEvent extends ApplicationEvent{
private static final long serialVersionUID = -7056841418193254583L;
private String address;
private String text;
public EmailEvent(Object source) {
super(source);
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
} 上面的EmailEvent类继承了ApplicationContext类,除此之外,它就是一个普通的Java类。
容器的监听器必须实现ApplicationListener接口,实现该接口必须实现方法: onApplicationEvent(ApplicationEvent event) 每当容器内发生任何事件时,此方法都被触发。
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
@Bean
public class EmailNotifier implements ApplicationListener<ApplicationEvent>{
//该方法会在容器发生事件时自动触发
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof EmailEvent){
//只处理EmailEvent,发送Email通知...
EmailEvent emailEvent = (EmailEvent)event;
System.out.println("需要发送的邮件的接收地址:"+emailEvent.getAddress());
System.out.println("需要发送邮件的邮件正文:"+emailEvent.getText());
}else{
//容器内置时间不做任何处理
System.out.println("容器本身事件: "+event);
}
}
} 从上面的配置文件中可以看出,为Spring容器注册事件监听器。当我们在Spring配置了一个实现ApplicationListener的Bean。Springl容器就会把这个Bean当初容器的监听器。
当系统创建Spring容器,加载Spring容器时会自动触发容器事件,容器事件监听器可以监听到这些事件。除此之外,程序也可调用ApplicationContext的publishEvent方法来主动触发容器事件。如下主程序使用ApplicationContext的publishEvent来触发事件。
ApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext.xml");
//创建一个ApplicationEvent对象 或者注入
EmailEvent ele = new EmailEvent("Hello");
ele.setAddress("123456@163.com");
ele.setText("Hello World");
//主动触发容器事件
ac.publishEvent(ele); 上面的代码通过ApplicationContext对象的publishEvent主动触发该事件。运行上面的程序将看到如下执行结果。
1 容器本身事件: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@141b571: startup date [Fri Sep 13 10:16:01 CST 2013]; root of context hierarchy]
2 需要发送的邮件的接收地址:123456@163.com
3 需要发送邮件的邮件正文:Hello World
总结
解耦业务逻辑:利用ApplicationContext 事件机制,可以解除代码耦合。
异步处理:某些操作可以通过事件机制异步处理,提升系统响应速度。
扩展性:可以很容易地添加新的事件处理器,而不会影响现有代码。