一、场景:类与类之间的消息通信,例如创建一个对象前后做拦截,日志等等相应的事件处理。

二、事件监听步骤

(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)--事件监听的更多相关文章

  1. SpringBoot入门之事件监听

    spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利,sptingboot支持的事件类型有以下五种: ApplicationStartingEvent Applicatio ...

  2. SpringBoot事件监听机制及观察者模式/发布订阅模式

    目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...

  3. java Gui编程 事件监听机制

    1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 ...

  4. SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringApplicat ...

  5. springboot 中事件监听模型的一种实现

    目录 定义事件本身 定义事件源 定义监听者 一.需要实现 ApplicationListener 二.使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种常用的设计模式 ...

  6. SpringBoot Application事件监听

    SpringBoot Application共支持6种事件监听,按顺序分别是: ApplicationStartingEvent:在Spring最开始启动的时候触发 ApplicationEnviro ...

  7. springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署

    知识点梳理 课堂讲义 02-SpringBoot自动配置-@Conditional使用 Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载 ...

  8. SpringBoot的事件监听

    事件监听的流程分为三步:1.自定义事件,一般是继承ApplicationEvent抽象类.2.定义事件监听器,一般是实现ApplicationListener接口.3.a.启动的时候,需要将监听器加入 ...

  9. Javascript事件模型系列(三)jQuery中的事件监听方式及异同点

    作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery>开始,到现在使用jQuery有一年 ...

随机推荐

  1. ansible最佳实战部署nginx

    1.先看下整体目录架构 [root@bogon ~]# cd /etc/ansible/ [root@bogon ansible]# tree . ├── ansible.cfg ├── group_ ...

  2. tarjan缩点相关知识及代码

    emmm原谅我确实是找不到不用缩点的tarjan题才会想到自学一下缩点这个东西的.. 题目没有,只能自己出数据并手动模拟... 首先看一张图(懒得画,还是看输入数据吧,劳烦自行画图..) 7 9(n个 ...

  3. USACO3.3 A Game【区间dp】

    这道题也是一道非常有意思的区间$dp$,和在纪中的这道题有点像:取数游戏 (除了取数规则其它好像都一样诶) 当时在纪中的时候就觉得这个$dp$非常不好想,状态定义都不是很容易想到. 但是做过一道这种题 ...

  4. PTA(Basic Level)1031.查验身份证

    一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...

  5. Oracle 查看 impdp 正在执行的内容

    1. 今天进行数据库备份恢复 一直卡住  找了一下 公司另外一个部门的方神提供了一个方法连查看 具体在做什么操作: 2. 现象. impdp 到一个地方直接卡住不动 具体位置 view 这个地方足足卡 ...

  6. win10+vs2013+pcl1.8.0(x86) 环境配置遇到的各种小问题解决

    1.PCL提供了各自的PDB调试文件(解压后放入pcl安装目录的bin下) 2.OpenNI的安装需同其余在pcl第三方库文件夹下 3.添加附加依赖项的.lib文件请按照网上对应版本添加,另外需要每行 ...

  7. HTTPS为什么是安全的?

    学习自https://www.cnblogs.com/zhangsanfeng/p/9125732.html,感谢博主 超文本传输协议HTTP被用于在web浏览器和网站服务器之间传递信息,但以明文方式 ...

  8. (转)终于有人把Elasticsearch原理讲透了!

    终于有人把Elasticsearch原理讲透了! 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 来源:互联网侦察 | 2019-04-08 ...

  9. volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意

    一.摘要 三级缓存,MESI缓存一致性协议,指令重排,内存屏障,JMM,volatile.单拿一个出来,想必大家对这些概念应该有一定了解.但是这些东西有什么必然的联系,或者他们之间究竟有什么前世今生想 ...

  10. webpack常用的插件

    webpack常用的开发插件 1.clean-webpack-plugin 运行webpack build时先把打包进入的文件夹清空 注意,它是以对象的方式去接收的 const { CleanWebp ...