SpringBoot框架(6)--事件监听
一、场景:类与类之间的消息通信,例如创建一个对象前后做拦截,日志等等相应的事件处理。
二、事件监听步骤
(1)自定义事件继承ApplicationEvent抽象类
(2)自定义事件监听器,一般实现ApplicationListener接口,传入自定义事件类
(3)配置监听器,启动时,需要把监听器加入到spring容器中(见实现方式)
(4)事件发布
三、实现方式
1、手动方式 --> 调用SpringBoot的addListeners方法把事件监听类添加的SpringBoot容器中
2、注解方式--> 事件监听类添加@Component
3、配置方式--> 在properties文件中配置,context.listener.classes=监听类全路径
4、事件处理类方式-->其实也是一种注解的方式,只是定义了专门的事件处理类+注解@EventListener(MyApplicationEvent.class) --> 该方法还可以指定监听的事件(推荐)
注:自定义事件无论采取哪种实现方式都需要通过SpringBoot容器的publishEvent方法类发布事件。
四、代码
1、建立Spring Initializr项目:boot-event
代码结构
首先实验第一种方式:手动方式
第一步 自定义事件类 MyApplicationEvent extends ApplicationEvent
package com.boot.event.bootevent; import org.springframework.context.ApplicationEvent; public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source) {
super(source);
}
}
MyApplicationEvent.java
第二步 自定义事件监听类
package com.boot.event.bootevent; import org.springframework.context.ApplicationListener; public class MyApplicationEventListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("接收到了事件:" + event.getClass());
}
}
MyApplicationEventListener.java
第三、四步 添加事件监听到spring容器 并发布自定义事件
package com.boot.event.bootevent; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication
public class BootEventApplication { public static void main(String[] args) {
SpringApplication app = new SpringApplication(BootEventApplication.class); //第一种方式:手动添加监听事
app.addListeners(new MyApplicationEventListener());
ConfigurableApplicationContext contex = app.run(args); //发布事件
contex.publishEvent(new MyApplicationEvent(new Object()));
contex.close();
}
}
BootEventApplication.java
打印结果:
接收到了事件:class com.boot.event.bootevent.MyApplicationEvent
以上手动调用addListeners把事件监听添加到Sring容器中管理。
第二种方式:注解方式 --> 事件监听类添加@Component
在第一种方式的基础上,在MyApplicationEventListener类添加注解@Component,如下
@Component
public class MyApplicationEventListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("接收到了事件:" + event.getClass());
}
}
把BootEventApplication.java中main方法的addListeners注释掉
//第一种方式:手动添加监听事
//app.addListeners(new MyApplicationEventListener());
运行项目,打印结果
接收到了事件:class com.boot.event.bootevent.MyApplicationEvent
可以看到自定义的事件同样被监听到。
第三种方式:配置方式
在第二种方法的基础上继续第三种方法,首先在application.properties配置文件中添加以下配置信息
context.listener.classes=com.boot.event.bootevent.MyApplicationEventListener
同时把MyApplicationEventListener类的注解@Component注释掉,如下所示
//第二种方式:添加注解
//@Component
public class MyApplicationEventListener implements ApplicationListener<MyApplicationEvent> {
//......
}
打印结果
接收到了事件:class com.boot.event.bootevent.MyApplicationEvent
说明配置的方法也成功让自定义的事件监听起作用
第四中方式:事件处理类方式 -->定义专门的事件处理类HandleEnvent.java(推荐)
package com.boot.event.bootevent; import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component; @Component
public class HandleEnvent {
@EventListener(MyApplicationEvent.class)
public void handleEvent(MyApplicationEvent event) {
System.out.println("接收到了事件:" + event.getClass());
System.out.println("接收到了事件:" + event.getSource());
} @EventListener(ContextClosedEvent.class)
public void handleEvent(Object event) {
System.out.println("接收到了事件:" + event.getClass());
}
}
HandleEnvent.java
把第三中方法中的配置信息注释掉,其他不变
#context.listener.classes=com.boot.event.bootevent.MyApplicationEventListener
打印结果
接收到了事件:class com.boot.event.bootevent.MyApplicationEvent
接收到了事件:java.lang.Object@1c4ee95c
接收到了事件:class org.springframework.context.event.ContextClosedEvent
SpringBoot框架(6)--事件监听的更多相关文章
- SpringBoot入门之事件监听
spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利,sptingboot支持的事件类型有以下五种: ApplicationStartingEvent Applicatio ...
- SpringBoot事件监听机制及观察者模式/发布订阅模式
目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...
- java Gui编程 事件监听机制
1. GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式: 1. 命令交互方式 图书管理系统 ...
- SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)
SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringApplicat ...
- springboot 中事件监听模型的一种实现
目录 定义事件本身 定义事件源 定义监听者 一.需要实现 ApplicationListener 二.使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种常用的设计模式 ...
- SpringBoot Application事件监听
SpringBoot Application共支持6种事件监听,按顺序分别是: ApplicationStartingEvent:在Spring最开始启动的时候触发 ApplicationEnviro ...
- springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署
知识点梳理 课堂讲义 02-SpringBoot自动配置-@Conditional使用 Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载 ...
- SpringBoot的事件监听
事件监听的流程分为三步:1.自定义事件,一般是继承ApplicationEvent抽象类.2.定义事件监听器,一般是实现ApplicationListener接口.3.a.启动的时候,需要将监听器加入 ...
- Javascript事件模型系列(三)jQuery中的事件监听方式及异同点
作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery>开始,到现在使用jQuery有一年 ...
随机推荐
- 本地虚拟机部署线上php程序---不需要修改数据库信息
1.特别注意:拿来线上php程序后一般是不需要修改config.php里面的数据库连接信息的,如果修改了会报错:站点已关闭.所以 2.5 步骤是需要省略的.如果拿来的是最开始的php源码,需要配置原始 ...
- ssm遇到的问题
1. Caused by: java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init> ...
- mycat是什么?你是怎么理解的?你们公司分库分表的分片规则是什么?搭建mycat环境常用的配置文件有哪些?
1.mycat是什么? 国内最活跃的.性能最好的开源数据库分库分表中间件 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集 ...
- 【AI-人工智能-mmdetection】ModuleNotFoundError: No module named 'mmdet.version'
在集成 mmdetection 框架时遇到这样的问题. ModuleNotFoundError: No module named 'mmdet.version' mmdetection 框架搭建过程很 ...
- python基础之字符串常用方法
str常用命令:字符操作:.capitalize() .upper() .lower() .title() .swapcase()判断:.startwith() .endwith() .isalnum ...
- [Python3] 025 包
目录 1. 模块 1.1 模块是什么? 1.2 为什么用模块? 1.3 如何定义模块? 1.4 如何使用模块? 1.4.1 例子1 1.4.2 例子2 1.4.3 例子3 1.4.4 例子4 1.4. ...
- Vue 进阶系列(一)之响应式原理及实现
Vue 进阶系列(一)之响应式原理及实现:https://juejin.im/post/5bce6a26e51d4579e9711f1d Vue 进阶系列(二)之插件原理及实现:https://jue ...
- Git介绍、安装、命令和实战
一.Git介绍 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 二.Git安装(Mac系统) 在Git官网下载安装包双击直接安装 在终端输入git来检测Git ...
- Servlet概念及与Jsp的区别
一.Servlet概念 Servlet是在服务器上运行的小程序.一个Servlet就是一个Java类,并且可以通过”请求-响应”编程模型来访问这个驻留在服务器内存里的Servlet程序 二.Servl ...
- algorithm下的常用函数
algorithm下的常用函数 max(),min(),abs() max(x,y)返回x和y中最小的数字 min(x,y)返回x和y中最大的数字 abs(x)返回x的绝对值,注意x应当是整数,如果是 ...