1、ApplicationContext的事件机制是使用标准的观察者模式实现。通过ApplicationEvent(被观察者)类和ApplicationListener(观察者)接口实现。
ApplicationEvent:容器事件,必须由ApplicationContext发布;
ApplicationListener:监听器,可有容器中任何的Bean担任;
实际上,Spring的时间机制和所有的时间机制都基本相似,他们都需要事件源、事件和事件监听器组成。只是此处的事件源是ApplicationContext,且事件必须由Java程序显示触发。
2、写一个事件例子:
容器事件:
/**
* 被观察者
*/
public class MyTestEvent extends ApplicationEvent {private static final long serialVersionUID = 1L;
private String id;
private String name;
public MyTestEvent(Object source) {
super(source);
}
public MyTestEvent(Object source, String id, String name) {
super(source);
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}}
监听器:
/**
* 观察者
* @author Administrator
*/
public class MyTestListner implements ApplicationListener<ApplicationEvent> {public void onApplicationEvent(ApplicationEvent arg0) {
if(arg0 instanceof MyTestEvent){
MyTestEvent event = (MyTestEvent)arg0;
System.out.println(event.getId());
}else{
}
}
}Java程序显示触发:
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-base.xml");
MyTestEvent ev = new MyTestEvent("hello", "001", "maomao");
ctx.publishEvent(ev);
}spring-base.xml监听配置:
<bean class="com.event.MyTestListner"></bean>
3、总结
当系统创建spring容器,加载spring容器时会自动触发容器事件,容器事件监听器可一件听到这些事件。除此之外,程序也可以调用ApplicationContext的publishEvent()方法来主动触发容器事件。