博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ApplicationContext的事件机制
阅读量:7108 次
发布时间:2019-06-28

本文共 2925 字,大约阅读时间需要 9 分钟。

hot3.png

    ApplicationContext的事件机制是观察者模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationConext的事件处理。如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEven时,ApplicationListener Bean将自动被触发。

    Spring的事件框架有如下两个成员:

    1)ApplicationEvent:容器事件,必须由ApplicationContext发布。

    2)ApplicationListener:监听器,可由容器中的任何监听器承担。

    Spring的事件机制与所有事件机制都基本相似,它们都需要事件源、事件和事件监听器组成。此处的事件源是ApplicationConetext,并且事件必须由Java程序显示触发。

    onApplicationEvent(ApplictionEvent event);每当容器内发送任何事件时,此方法都被触发;

 下面定义一个邮件事件:

package com.custle.spring;import org.springframework.context.ApplicationEvent;public class EmailEvent extends ApplicationEvent {	private String address;	private 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 String getAddress() {		return address;	}	public void setAddress(String address) {		this.address = address;	}	public String getText() {		return text;	}	public void setText(String text) {		this.text = text;	}}
package com.custle.spring;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationListener;public class EmailNotifiter implements ApplicationListener {	//该方法会在容器发送时自动触发	@Override	public void onApplicationEvent(ApplicationEvent event) {		if(event instanceof EmailEvent){			//只处理EmailEvent,发送email通知			EmailEvent emailEvent = (EmailEvent)event;			System.out.println("需要发送邮件的接收地址:"+emailEvent.getAddress());		}else{			//容器内置事件不作处理			System.out.println("容器本身的事件: "+ event);		}			}}

在applicationContext-spring.xml中配置邮件事件:

通过ClassPathXmlApplicationContext读取配置文件:

package com.custle.spring;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class EmailTest {	public static void main(String[] args) {		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-spring.xml");		EmailEvent emailEvent = new EmailEvent("hello", "526295149@qq.com", "send email");		//将EmailEvent事件添加至ApplicationContext容器		applicationContext.publishEvent(emailEvent);	}}

控制台输出:

2018-02-05 13:24:27  INFO (AbstractApplicationContext.java:513)  - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@22f4bf02: startup date [Mon Feb 05 13:24:27 CST 2018]; root of context hierarchy2018-02-05 13:24:27  INFO (XmlBeanDefinitionReader.java:316)  - Loading XML bean definitions from class path resource [applicationContext-spring.xml]容器本身的事件: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@22f4bf02: startup date [Mon Feb 05 13:24:27 CST 2018]; root of context hierarchy]需要发送邮件的接收地址:526295149@qq.com

上文是通过ApplicationContext的pulishEvent()来主动触发容器事件,其实当系统创建Spring容器、加载Spring容器时也会自动触发容器事件。

转载于:https://my.oschina.net/u/3697923/blog/1618524

你可能感兴趣的文章
Max retries exceeded with ur
查看>>
c#中WebBrowser控件的使用方法
查看>>
第一版
查看>>
PHP时间比较和时间差如何计算
查看>>
hdu1495(经典bfs,平分水问题)
查看>>
4月27日微软云训练营活动-现场图集
查看>>
[Ubuntu] APT - Advanced Packaging Tool 简明指南
查看>>
PostgreSQL的autovacuum 与 vacuum full
查看>>
2013Hulu校园招聘笔试题
查看>>
每日英语:First Offer: Take It Or Keep Waiting?
查看>>
为iOS应用制作一个二维码
查看>>
软件运行过慢?系统打开特别慢?连系统都装不了?可能是硬盘坏了
查看>>
分析MySQL慢日志(转)
查看>>
Gradle学习系列之三——读懂Gradle语法
查看>>
把1000个随机数写入到文件中
查看>>
如果让我完善几年前的一个项目,我会做哪些改进?
查看>>
Mockito为什么不能mock静态方法
查看>>
Android 应用程序之间数据共享—ContentProvider (涉及访问权限)
查看>>
开发中用到的一个快速排序法
查看>>
深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构
查看>>