引言

上一篇文章转了一篇关于ApplicationListener用于在Web项目启动时做一些初始化的用法。

但是,在实际生产过程中,当一个事件产生,又是如何被onApplicationEvent()方法监听到,并执行一系列动作呢?简单搜索了一下,终于掌握了从定义事件、发布事件到最后监听方法执行的常规用法,在此记录。

据我了解,spring 底层对监听机制的实现应该用到了观察者模式,关于观察者模式的解释可以参考《Java常用设计模式————观察者模式》。

本篇博客只涉及到关于spring 监听机制的用法,不涉及底层的原理(不过有时间的话一定会进一步整理底层实现的方式),将会通过事件定义监听后操作事件触发(发布)这三个部分来实现一个简单的业务逻辑:监听一个学生的逃课事件,并在事件触发后执行一个有效的措施。

实现步骤

1、定义事件类

事件类需要继承抽象类ApplicationEvent,且必须包含一个有参构造器,这个参数是顶级父类EventObject的一个属性,标识一个与这个事件相关联的资源对象Object。下面代码中的showSkipStuInfo()方法是一个自定义的方法,用于打印一些日志信息。

@SuppressWarnings("serial")
public class SkipClassEvent extends ApplicationEvent {private static final Logger logger = LoggerFactory.getLogger(SkipClassEvent.class);public SkipClassEvent(Object source) {super(source);}/** 显示逃课学生信息 */public void showSkipStuInfo(Student stu) {logger.info("逃课学生信息:" + stu.toString());}
}

其中,Student是一个只包含 name 和 gender 的简单Java对象:

/** 学生对象 */
public class Student {public enum Gender {MALE, FAMALE;}private String name;private Gender gender;public Student(String name, Gender gender) {this.name = name;this.gender = gender;}@Overridepublic String toString() {return "{name : " + name + ", gender : " + gender + "}";}// getter...setter...
}

2、编写监听器

自定义的监听器类SkipClassListener实现了ApplicationListener接口的onApplicationEvent方法,并指定监听的事件类型为SkipClassEvent,当事件适时触发时,spring框架会自行调用onApplicationEvent方法

@Component
public class SkipClassListener implements ApplicationListener<SkipClassEvent> {private static final Logger logger = LoggerFactory.getLogger(SkipClassListener.class);@Overridepublic void onApplicationEvent(SkipClassEvent event) {Student stu = (Student) event.getSource();event.showSkipStuInfo(stu);logger.info("采取措施:通知" + stu.getName() + "的家长!!!");}
}

3、事件触发

编写一个最简单的Spring Boot单元测试,来观察执行效果。

首先,我们必须获得一个ApplicationContext对象,因为在spring框架中事件的触发要使用ApplicationContext对象publishEvent()方法,实际上从这个方法的命名来看,我们应该称之为“发布事件”,但本人更喜欢将这个调用称为“触发事件”,不过这都没有关系。

(在实际开发中,我们也可以像下面代码这样通过@Autowired注解,将ApplicationContext注入,或者,通过启动类的SpringApplication.run(...)得到这个对象,并把它作为一个类属性(static修饰)来调用)

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {@Autowiredprivate ApplicationContext applicationContext;@Testpublic void testListener() {Student skipStu = new Student("张明", Gender.MALE);applicationContext.publishEvent(new SkipClassEvent(skipStu));}
}

测试testListener()方法,执行结果如下:

综上,是对事件监听的常规用法总结,欢迎文末留言。

Spring Boot————ApplicationListener实现逃课事件监听相关推荐

  1. spring boot实战(第二篇)事件监听

    前言 spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利. 支持的事件类型四种 ApplicationStartedEvent ApplicationEnvironmen ...

  2. Spring Boot————应用启动时的监听机制测试

    引言 本文承接前面的<Spring Boot----Spring Boot启动流程分析>,主要测试一下ApplicationContextInitializer.SpringApplica ...

  3. 框架源码专题:Spring的事件监听、发布机制 ApplicationListener

    文章目录 1.Spring内置事件 2.自定义事件 3.事件监听器 4.事件发布 publishEvent 4.Spring事件原理 5. 面试题:怎么样可以在所有Bean创建完后做扩展代码? 6. ...

  4. SpringBoot ApplicationListener监听器的使用-监听ApplicationReadyEvent事件

    SpringBoot监听器 ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现Applic ...

  5. java 事件监听应用_Spring Boot应用事件监听示例详解

    前言 本文主要给大家介绍了关于Spring Boot应用事件监听的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1. Spring Boot特有的应用事件 除了Spring ...

  6. Spring事件监听流程分析【源码浅析】

    一.简介 Spring早期是通过实现ApplicationListener接口来定义监听事件,在spring4.2的时候开始我们可以通过@EventListener注解来定义监听事件,Applicat ...

  7. spring 事件监听

    用一个简单的例子来实现spring事件监听的功能 这个例子主要功能是,记录那些用户是第一次登入系统,如果用户是第一次登入系统,则调用spring的事件监听,记录这些用户. 主要用到的spring的类和 ...

  8. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析

    文章目录 Pre 概览 开天辟地的时候初始化的处理器 @EventListener EventListenerMethodProcessor afterSingletonsInstantiated 小 ...

  9. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

最新文章

  1. Blender中的主程序纹理学习课程 Master Procedural Texturing in Blender
  2. Redis入门到精通-Redis高级命令
  3. python中日期和时间格式化输出的方法小结_Python 时间操作例子和时间格式化参数小结...
  4. SAP Spartacus的产品主数据模型
  5. 【循序渐进学Python】14.数据库的支持
  6. WPF案例 (六) 动态切换UI布局
  7. 用C语言程序实现黎曼和求定积分
  8. 如何做一名合格的面试官
  9. eclipse中快捷搜索文件快捷键
  10. [MicroPython]F407控制DS3231读取时间、温度
  11. Windows DLL 注入技术
  12. 腾讯云服务器价格明细表(CPU内存/带宽/磁盘)
  13. ansys 19.2无法连接到服务器证书,360运行时ansys19.0就无法连接许可服务了
  14. 【聚合支付】 如何区分界定聚合支付中的“一清”和“二清”?
  15. APUE-第5章 标准IO库
  16. n79登陆微信显示服务器繁忙,不支持n79就算“阉割”?5G手机全网通争议又来了...
  17. RabbitMQ(四)远程连接RabbitMQ
  18. 大一统视角理解扩散模型
  19. 亥姆霍兹线圈结构原理
  20. 怎样同时查询多个苏宁快递单号的物流信息

热门文章

  1. c语言宏函数怎么传递宏参数_C语言中的宏参数评估
  2. Python通过snmp获取交换机VLAN号、VLAN默认网关、VLAN子网掩码和ARP表中的IP地址与MAC对应记录数据
  3. Python3自带HTTP文件传输服务(局域网文件共享)
  4. QT5 exec()模态显示子对话框,父子对话框都最小化后显示桌面
  5. CentOS 安装go client调用Kubernetes API
  6. windows下配置caffe-matlab接口
  7. android listview 数据数组制作,android – 从对象的数组列表中填充listview
  8. c语言 正号运算符 作用,C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,...
  9. JavaScript复习使用定时器的简易式诸葛大力轮播图
  10. 电脑配置多个git账号