什么是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