ApplicationContext的事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext的事件处理。如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean 将自动被触发。
ApplicationEvent类
package EventMechanism;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ApplicationContextEvent;
public class EmailEvent extends ApplicationContextEvent {
private String address;
private String text;
public EmailEvent(ApplicationContext source) {
super(source);
}
public EmailEvent(ApplicationContext source, String address, String text) {
super(source);
this.address = address;
this.text = text;
}
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;
}
}
容器监听器类
package EventMechanism;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class EmailNotifier implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) { //该方法会在容器发生事件时自动触发
// TODO Auto-generated method stub
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);
}
}
}
将监听器配置在容器中,配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"
>
<bean class="EventMechanism.EmailNotifier" />
</beans>
当系统创建Spring容器、加载Spring容器时会自动触发容器事件,容器事件监听器可以监听到这些事件。除此之外,程序也可调用ApplicationContext的pulishEvent()方法来自动触发容器事件。
测试
package EventMechanism;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
//创建一个ApplicationEvent对象
EmailEvent ele = new EmailEvent(ctx, "spring_test","this is a test");
//主动触发容器事件
ctx.publishEvent(ele);
}
}
结果