ApplicationListener--- Spring源码从入门到精通(二十九)

2023-10-29

上篇文章说了bean对象创建之前调用的两个方法:

BeanDefinitionRegistryPostProcessor--- Spring源码从入门到精通(二十八)

这篇文章主要介绍spring监听事件源码及实例解析:

ApplicationListener:监听容器中发布的事件,事件驱动模型的开发。

  1. 写一个监听器来监听某个事件(ApplicationEvent)
  2. 吧监听器加入到容器
  3. 只要容器中有相关事件发布,就能监听到:A、ContextRefreshedEvent容器刷新完成,所有bean都完全创建,会发布这个事件。B、ContextClosedEvent关闭容器会发布这个事件。(spring事件)
  4. 自己如何发布事件。

/**
 * @author keying
 */
@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {

    /**
     * 当容器中发布此事件,方法会得到触发
     *
     * @param event
     */
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("收到的事件:" + event);
    }
}
 @Test
    public void test() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
        applicationContext.publishEvent(new ApplicationEvent("自定义发布事件") {});

        applicationContext.close();
    }

从打印中可以看到,监听到三个事件,两个spring容器刷新和容器close的事件,一个是自定义事件。

  • contextRefreshedEvent

  1. 容器创建,refresh()
  2. FinashRefresh,容器刷新完成最后一步。

 

  1. 里面有个方法publishEvent(new ContextRefreshedEvent)

事件发布流程:A、获取事件多波器(派发器): getApplicationEventMulticaster。B、multicastEvent派发事件。C、获取到所有的ApplicationListener循环。若有executor支持进行异步派发。否则同步的方式直接执行listener方法。InvokeListener()。

  1. 返回listener回调onApplicationEvent方法。
  • 自定义发布事件

自己调用publshEvent方法。

  • 事件派发器getApplicationEventMulticaster详解

  1. refresh方法刷新。
  2. initApplicationEventMulticaster方法。

 

  1. 先判断容器中是否有id = applicationEventMulticaster的组件。没有就直接new 一个,并且加入容器中,就可以在其他组件派发事件时候,自动注入这个applicationEventMulticaster。

 

  • 容器中有哪些监听器

  1. refresh()方法里面有个注册所有的监听器registerListener。

 

  1. 从容器中按ApplicationListener类型找到的listener加入到派发器。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ApplicationListener--- Spring源码从入门到精通(二十九) 的相关文章

随机推荐

  • 自动控制原理:反馈控制系统的复域分析

    参考文献 1 胡寿松 自动控制原理 M 第六版 北京 科学出版社 2015 2 姜增如 自动控制理论虚拟仿真与实验设计 M 第一版 北京 北京理工大学出版社 2020 文中出现的代码均为Matlab代码 1传递函数 传递函数 transfe
  • 【面试题】:说一下登录模块的思路以及登录的优化

    1 静态 首先我们要做静态和表单验证 2 密码加密 在输入完手机号和密码后 我们要对密码进行加密 加密的话使用插件md5对密码加密 之后将请求发送到后台 3 封装登录 因为我们在项目里的请求是按模块来进行划分的 所以我们会通过axios方法
  • java数组显示_java数组

    1 package com oracle demo01 2 3 public class MyArray 4 定义一个数组 5 private int intArray 6 定义数组的实际有效长度 7 private int elems 8
  • 多线程事务

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T
  • html转turndown 踩雷 以及成功方案 (vue2 + tinymce富文本框)

    showdown 这里使用showdown转换 富文本框内所有格式够可以 但是表格不行 表格转换为竖线 内容丢失 如果没有表格需求 可参 注意 这里的this markdown 是在data中声明的 this value为你要转换的html
  • jdbc连接oracle连接重置问题

    error ConnectionProviderFactory initializeConnectionProviderFromConfig 173 Initializing connection provider org springfr
  • 服务器系统的安装方法,服务器的操作系统安装方法

    服务器的操作系统安装方法 内容精选 换一换 如果Windows操作系统云服务器未安装密码重置插件 可以参见本节内容重新设置密码 本节操作介绍的方法仅适用于修改Windows本地账户密码 不能修改域账户密码 Linux操作系统请参见重置Lin
  • K-小千很好奇-(素数)2023河南萌新联赛第(八)场:南阳理工学院

    include
  • MYSQL-ORCALE decode函数在MYSQL中的实现

    一 select ifnull etl filed col mysql中实现oracle的decode函数需要用到三个函数 1 ELT N str1 str2 str3 若N 1 则返回值为 str1 若N 2 则返回值为 str2 以此类
  • 蓝桥杯java基础练习学习。

    一 基础练习 大部分程序来自查阅网络资源总结 1 A B的问题 package Chapter01 import java util Scanner A B的问题 public class Demo01 public static void
  • MPI > Ubuntu22.04安装MPICH4.0.2并行平台

    MPICH4 0 2 MPICH4 0 2 环境 下载 安装 环境变量 测试单机环境 准备多机环境 配置MPI多机环境 MPICH4 0 2 搭建PSRS Parallel Sorting by Regular Sampling 算法运行环
  • 《数据挖掘导论》归纳笔记

    目录 第一章 绪论 第二章 数据 2 0引言 2 0 1数据类型 2 0 2数据的质量 2 0 3使数据适合挖掘的预处理步骤 2 0 4根据数据联系分析数据 2 1数据类型 2 1 1 属性与度量 2 1 2 数据集的类型 2 2数据质量
  • android 内存溢出前退出界面,Android 导航(介绍)页面ViewPager内存溢出解决方法...

    现在基本每个Android App都会标配一个启动介绍的页面 或做产品介绍 或做app功能展示 既然起导航界面 基本思路就是用ViewPager实现 图片引自UI中国一设计师的设计图片 正好这几天在做这个导航界面 我的测试手机是魅族MX3
  • 常见经济指标学习

    央行统计数据 http www pbc gov cn diaochatongjisi 116219 116319 3959050 3959052 index html 资产负债表 可以看出央行在扩表还是缩表 央行中的资产代表着 基础货币 基
  • 2023高频前端面试题总结(附答案)

    html与css 1 img 的title与alt有什么区别 title是提示文本 鼠标放在图片上提示的文字 alt 是图片显示不出来时的文字替代 能显示出来就不用替换 2 label的作用是什么 怎么用 Label与表单input配合使用
  • 无法定位程序输入点于动态链接库怎么办

    在使用笔记本电脑的时候 如果操作不小心误删了某些文件 可能会导致无法定位程序 打开程序时会被提示无法定位程序输入点于动态链接库怎么办 今天 小编就把无法定位程序输入点于动态链接库的解决方法分享给大家 更多一键重装系统教程可参考小白系统网 解
  • OpenCV(三)——图像分割(二)

    目录 4 边缘检测 4 1 图像梯度的概念 4 2 模板卷积和梯度图的概念 4 3 梯度算子
  • KylinOS-Server定制制作属于自己的ISO镜像文件

    1 准备 镜像文件 Kylin Server 10 SP1 Release Build20 20210518 x86 64 iso 然后安装在服务器上 用来定制ISO的服务器 根据自己的需求选择安装 我这里选择的是GUI安装 2 安装制作I
  • 前端ps基本操作

    在还原设计时 我们需要使用 photoshop打开sd格式的设计 作为的工程师 我们不要太多的ps技巧 只需要了 一些简单的基本操作即可 1 alt 滚轮缩放放图片 2 空格 鼠标左健拖动图片 3 shift m切换选取工具 使用鼠标左键选
  • ApplicationListener--- Spring源码从入门到精通(二十九)

    上篇文章说了bean对象创建之前调用的两个方法 BeanDefinitionRegistryPostProcessor Spring源码从入门到精通 二十八 这篇文章主要介绍spring监听事件源码及实例解析 ApplicationList