ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。

如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。这种事件机制都必须需要程序显示的触发。

其中spring有一些内置的事件,当完成某种操作时会发出某些事件动作。比如监听ContextRefreshedEvent事件,当所有的bean都初始化完成并被成功装载后会触发该事件,实现ApplicationListener<ContextRefreshedEvent>接口可以收到监听动作,然后可以写自己的逻辑。

同样事件可以自定义、监听也可以自定义,完全根据自己的业务逻辑来处理。

内置事件

序号 Spring 内置事件 & 描述
1

ContextRefreshedEvent

ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext接口中使用 refresh() 方法来发生。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用

2

ContextStartedEvent

当使用 ConfigurableApplicationContext (ApplicationContext子接口)接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。

3

ContextStoppedEvent

当使用 ConfigurableApplicationContext 接口中的 stop() 停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。

4

ContextClosedEvent

当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。

5

RequestHandledEvent

这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。只能应用于使用DispatcherServlet的Web应用。在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件。

业务方监听事件举例

比如要监听ContextRefreshedEvent的时可以实现ApplicationListener接口,并且传入要监听的事件

@Component
public class TestApplicationListener implements ApplicationListener<ContextRefreshedEvent>{@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {System.out.println(contextRefreshedEvent);System.out.println("TestApplicationListener............................");}
}

自定义事件

可以自定义事件,然后做完业务处理后手动发出。同上集成某个监听接口,接收到事件后进行业务处理

事件定义:

public class EmailEvent extends ApplicationEvent{private String address;private String text;public EmailEvent(Object source, String address, String text){super(source);this.address = address;this.text = text;}public EmailEvent(Object source) {super(source);}//......address和text的setter、getter
}

监听定义

public class EmailNotifier implements ApplicationListener{public void onApplicationEvent(ApplicationEvent event) {if (event instanceof EmailEvent) {EmailEvent emailEvent = (EmailEvent)event;System.out.println("邮件地址:" + emailEvent.getAddress());System.our.println("邮件内容:" + emailEvent.getText());} else {System.our.println("容器本身事件:" + event);}}
}

业务触发

public class SpringTest {public static void main(String args[]){ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");//创建一个ApplicationEvent对象EmailEvent event = new EmailEvent("hello","abc@163.com","This is a test");//主动触发该事件context.publishEvent(event);}
}

不管是内置监听还是外部自定义监听一定要把实现ApplicationListener的类定义成一个bean才行,可以是通过注解@Component等也可以通过xml的方式去执行。

理解 Spring ApplicationListener相关推荐

  1. 深入理解Spring系列之六:bean初始化

    <深入理解Spring系列之四:BeanDefinition装载前奏曲>中提到,对于非延迟单例bean的初始化在finishBeanFactoryInitialization(beanFa ...

  2. 《深入理解Spring Cloud与微服务构建》出版啦!

    作者简介 方志朋,毕业于武汉理工大学,CSDN博客专家,专注于微服务.大数据等领域,乐于分享,爱好开源,活跃于各大开源社区.著有<史上最简单的Spring Cloud教程>,累计访问量超过 ...

  3. 不同类的方法 事务问题_深入理解 Spring 事务原理

    Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...

  4. 深入理解Spring系列之三:BeanFactory解析

    转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483824&idx=1&sn=9b7c2603093 ...

  5. 透彻理解Spring事务设计思想之手写实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原 ...

  6. 【手写系列】透彻理解Spring事务设计思想之手写实现

    事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...

  7. 互相引用 spring_巧夺天工,这样理解Spring的IOC、DI下来,真的很清晰了

    前言 你可能会有如下问题: 想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子又忘了本 ...

  8. 深入理解Spring Redis的使用 (一)、Spring Redis基本使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  9. Spring Boot教程(7) – 直观地理解Spring容器

    在你学习Spring之前,你肯定听说过"控制反转"."依赖注入"."上下文"等名词,伴随着这些名词的,是一些冗长晦涩的解释,这些解释并没有什 ...

最新文章

  1. C++ 析构函数(函数前面有波浪号~)
  2. 51nod 1040:最大公约数之和(数论)
  3. java中Hashtable中的t为什么是小写(转)
  4. hdu6165 缩点,dfs
  5. Active Diretory 全攻略(三)--建立域(2)
  6. Elasticsearch-Jest 配置ES集群源码解读
  7. 黑龙江大学计算机调剂信息,黑龙江大学各学院2019考研调剂信息汇总(4月1日)
  8. 征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例
  9. 粘包拆包,Netty及远洋通信中的解决方案!超实用
  10. 视频移动侦测VMD的实现
  11. spring_boot的logback-spring.xml配置为什么 %d{yyyy-MM-dd} 不起作用
  12. pxe无人值守智能安装linux
  13. 编程之美 4.4点是否在三角形内
  14. 2022年C语言教程入门和最新C语言自学教程C语言进阶教程大全
  15. 21岁雅虎卖身引发一波怀旧 市值曾高达1250亿美元
  16. RS485两台设备用了半年,今天突然没数了,并上串口一直时不时有多余FF等乱码输出。单独串口接电脑试都正常,共地就正常了
  17. 购买JSP空间上当的其他网友登载的地址
  18. steam饥荒服务器为什么显示未响应,《饥荒:联机版》服务器卡顿原因分析及解决教程...
  19. C语言lseek()函数和 fseek()函数 rewind函数
  20. Android调用系统自带的文件管理器,打开指定路径

热门文章

  1. openwrt mqtt客户端(五)
  2. 2022年全球及中国X射线源行业应用现状与十四五需求前景预测报告
  3. 关于Object转Json方式及问题
  4. 年度重磅!《2022华为开发者宝典》多元生态技术精选,学练考一站式能力进阶
  5. 下一代 Web 建站技术栈—— Jamstack
  6. Redis实现分页查询
  7. 30分钟玩转Python后端Flask
  8. java 打劫_【JAVA算法题】职业抢劫
  9. python反弹shell_反弹shell的各种姿势
  10. 四轮电磁------速度环增量式PID