spring 事件处理

来源:互联网 发布:windows 国产平板 编辑:程序博客网 时间:2024/06/05 17:17

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接口

@Servicepublic 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,"青龙"));//方法二


 

 

 

原创粉丝点击