Java提供了事件机制,在使用spring的时候,我们可以把普通的java事件操作定义为bean集成到bean容器中,但还有一种更方便的方式,即使用spring已集成的事件支持。
在使用Spring的事件支持时,我们需要关注以下几个对象:
1. ApplicationEvent:继承自EventObject,同时是spring的application中事件的父类,需要被自定义的事件继承。
2. ApplicationListener:继承自EventListener,spring的application中的监听器必须实现的接口,需要被自定义的监听器实现其onApplicationEvent方法
3.Spring中提供一些Aware相关的接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到的是ApplicationContextAware。实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入ApplicationContext的实例。ApplicationContextAware提供了publishEvent()方法,实现Observer(观察者)设计模式的事件传播机,提供了针对Bean的事件传播功能。通过Application.publishEvent方法,我们可以将事件通知系统内所有的ApplicationListener。
1.继承ApplicationEvent
public class AnimalSpeakEvent extends ApplicationEvent{
private static final long serialVersionUID = 1L;
private String animalName;
public String getAnimalName() {
return animalName;
}
public AnimalSpeakEvent(Object source) {
super(source);
}
public AnimalSpeakEvent(Object source,String animalName) {
super(source);
this.animalName = animalName;
}
}
2.定义监听类,实现ApplicationListener接口
@Service
public class AnimalEventListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof AnimalSpeakEvent) {
AnimalSpeakEvent a = (AnimalSpeakEvent) event;
System.out.println("事件监听器" + this.getClass().getSimpleName()+":有一个动物在讲话!它的名字是:"+ a.getAnimalName());
}
}
}
3. 发布事件,Bean类调用容器的方法发布事件。
a、继承后处理Bean接口ApplicationContextAware,实现setApplicationContext。
b、调用传入的ApplicationContext的publishEvent方法发布事件。
@Service("animal")
public class Animal implements ApplicationContextAware {
private ApplicationContext ac;
private String name;
private int age;
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
this.ac=arg0;
}
public String speak(){
ac.publishEvent(new AnimalSpeakEvent(this,this.name));
return " 我的名字是;"+this.name+",我的年龄是:"+this.age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
4.配置
<bean id="animal" class="com.mvc.event.Animal">
<property name="name" value="老虎" />
<property name="age" value="5" />
</bean>
5.使用事件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//事件处理
Animal animal=(Animal)applicationContext.getBean("animal");
animal.speak();//方法一
applicationContext.publishEvent(new AnimalSpeakEvent(AnimalSpeakEvent.class,"青龙"));//方法二