Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法

  • Post author:
  • Post category:其他




什么是ApplicationContext?



它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些。

ApplicationContext则是应用的容器。

Spring把Bean(object)放在容器中,需要用就通过get方法取出来。



ApplicationEvent

是个抽象类,里面只有一个构造函数和一个长整型的timestamp。



ApplicationListener

是一个接口,里面只有一个onApplicationEvent方法。

所以自己的类在实现该接口的时候,要实装该方法。





如果在上下文中部署一个实现了ApplicationListener接口的bean,



那么每当在一个ApplicationEvent发布到 ApplicationContext时,

这个bean得到通知。其实这就是标准的Oberver设计模式。

下面给出例子:

首先创建一个ApplicationEvent实现类:

package com.spring.event;

import org.springframework.context.ApplicationEvent;

/**
 * @Package Name : ${PACKAG_NAME}
 * @Author : dongfucai@meituan.com
 * @Creation Date : 2018年07月13日下午3:46
 * @Function : todo
 */
public class EmailEvent extends ApplicationEvent {

    private static final long serialVersionUID=1L;
    public String address;
    public String text;

    public EmailEvent(Object source){
        super(source);
    }

    public EmailEvent(Object source,String address,String text){
        super(source);
        this.address=address;
        this.text=text;
    }

    public void print(){
        System.out.println("hello spring event!");
    }


}

给出监听器:

package com.spring.event;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

/**
 * @Package Name : ${PACKAG_NAME}
 * @Author : dongfucai@meituan.com
 * @Creation Date : 2018年07月13日下午3:52
 * @Function : todo
 */



/**
 * java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
 *
 * 用法:
 * result = object instanceof class
 * 参数:
 * Result:布尔类型。
 * Object:必选项。任意对象表达式。
 * Class:必选项。任意已定义的对象类。
 * 说明:
 * 如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
 */
public class EmailListener implements ApplicationListener {


    @Override
    public void onApplicationEvent(ApplicationEvent event){
        if (event instanceof EmailEvent){

            EmailEvent emailEvent = (EmailEvent)event;
            emailEvent.print();
            System.out.println(emailEvent.getSource());
            System.out.println(emailEvent.address);
            System.out.println(emailEvent.text);

        }
    }

}

applicationContext.xml文件配置:

<bean id=”emailListener” class=”com.spring.event.EmailListener”></bean>

测试类:

package com.spring.event;

import com.oplog.impl.AServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Package Name : ${PACKAG_NAME}
 * @Author : dongfucai@meituan.com
 * @Creation Date : 2018年07月13日下午4:34
 * @Function : todo
 */

/**
 *
 如果在上下文中部署一个实现了ApplicationListener接口的bean,

 那么每当在一个ApplicationEvent发布到 ApplicationContext时,
 这个bean得到通知。其实这就是标准的Oberver设计模式。


 */
public class ListerTest {

    public static void main(String[] args) {


        ApplicationContext context  = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

        EmailEvent event = new EmailEvent("hello","boylmx@163.com","this is a email text!");

        context.publishEvent(event);



    }

}

测试结果:

hello spring event!

hello

boylmx@163.com

this is a email text!

Process finished with exit code 0