Spring的ApplicationContext能够发布时间并且允许注册相应的事件监听器,因此他拥有一套完善的事件发布和监听机制。在事件体系中,除了事件和监听器以外,还有另外三个重要的概念:
1)事件源:时间的产生者,任何一个EventObject都必须拥有一个事件源;
2)事件监听器注册表:组件或框架的事件监听器必须有所依存,也就是说组件或框架必须提供一个地方保存时间监听器,这便是事件监听器注册表。一个事件监听器注册到组件或框架中其实就是保存在监听器注册表里面;
3)它是事件和事件监听器沟通桥梁,负责把事件通知给事件监听器。
Spring框架本身定义了三个事件,
1) ContextRefreshedEvent:当容器初始化或者刷新时产生该事件,就是调用容器的refresh()方法时会产生该事件;
2) ContextClosedEvent:当容器关闭前产生该事件,即调用容器的close()方法时就会产生该事件;
3)RequestHandleEvent:这是一个与Web应用相关的事件,当一个HTTP请求被处理后,产生该事件。只有在web.xml中定义了DispatcherServlet时才产生该事件。
我们也可以扩展ApplicationEvent定义自己的事件,完成其他特殊功能。
自定义一个事件监听器 代码如下:
该事件继承ApplicationEvent类
public class MailSendEvent extends ApplicationEvent{
private String to;
public MailSendEvent(Object source,String to) {
super(source);
this.to = to;
System.out.println("实例化MailSendEvent");
}
public String getTo(){
return this.to;
}
}
该监听器实现了ApplicationListener接口,并实现其中的onApplicationEvent方法。event instanceof MailSendEvent 表明该监听器只能监听到 MailSendEvent事件。
public class MailSendListener implements ApplicationListener{
public MailSendListener(){
System.out.println("实例化监听器");
}
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof MailSendEvent){
MailSendEvent mse = (MailSendEvent)event;
System.out.println("MailSendListener:向"+mse.getTo()+"发送完一封邮件");
}
}
}
ApplicationContextAware接口是在实例化MailSender只有调用,setApplicationContext()方法在此处注入ApplicationContext 对象,sendMail()方法中 ctx.publishEvent(mse); 向容器中所有的事件监听器发送事件,所以调用该方法后会激活监听该事件的事件监听器,而此事件是mse即MailSendEvent,所以将被MailSendListener 监听到。
public class MailSender implements ApplicationContextAware{
private ApplicationContext ctx;
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
this.ctx = ctx;
System.out.println("调用ApplicationContextAware接口方法");
}
public void sendMail(String to){
System.out.println("MailSender:模拟发送邮件");
MailSendEvent mse = new MailSendEvent(this, to);
//向容器中所有的事件监听器发送事件
ctx.publishEvent(mse);
}
}
调用发送,启动事件,激活事件监听器。
public class MailSend {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/Spring/event/beans.xml");
MailSender mailSender = (MailSender)ctx.getBean("mailSender");
//mailSender.setApplicationContext(ctx);
mailSender.sendMail("songbo_mail@126.com");
}
}
配置文件表示当容器启动时,会根据此配置信息自动注册MailSendListener监听器。
<bean class="com.Spring.event.MailSendListener"></bean>
<bean id="mailSender" class="com.Spring.event.MailSender"></bean>
分享到:
相关推荐
第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的内核中,分析它的底层结构和具体实现。 第7章:对如何使用基于AspectJ配置AOP的知识进行了深入的分析,这包括使用XML Schema配置文件、...
5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 ...
Linux网络体系结构 Linux内核中网络协议的设计与实现,Linux网络体系结构 Linux内核中网络协议的设计与实现
管理解构企业管理能力体系建设PPT课件.pptx
5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 ...
管理解构企业管理能力体系建设.pptx
要不要做会员?解构会员体系的本质.pdf
管理解构企业管理能力体系建设学习教案.pptx
第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的内核中,分析它的底层结构和具体实现。 第7章:对如何使用基于AspectJ配置AOP的知识进行了深入的分析,这包括使用XML Schema配置文件、...
管理解构企业管理能力体系建设PPT学习教案.pptx
管理解构-企业管理能力体系建设.ppt
CRM知识解构、策略设计及SaaS体系下的柔性开发实践分享_CRM产品经理 需求规格说明书管理系统规格需求说明书模板.pdf
关注用户体验,关注Web用户体验解构,互联网思维,用户体验是王道
077-城市绿色交通体系解构与分析.pdf
网站设计解构.pdf
管理解构---企业管理能力体系建设.pptx
通过架构实现以BIO、NIO为核心的I/O模型的ServerSocket,解构HTTP1.1协议内容,并且封装简易的API以达到类似Tomcat、Servlet的效果。 业务逻辑上通过Flyboot框架,实现对接口的解析以及系列逻辑判断,将最终的结果以...