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

简介: ApplicationListener--- Spring源码从入门到精通(二十九)
  • 上篇文章说了bean对象创建之前调用的两个方法:

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


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


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


写一个监听器来监听某个事件(ApplicationEvent)

吧监听器加入到容器

只要容器中有相关事件发布,就能监听到:A、ContextRefreshedEvent容器刷新完成,所有bean都完全创建,会发布这个事件。B、ContextClosedEvent关闭容器会发布这个事件。(spring事件)

自己如何发布事件

/**
 * @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的事件,一个是自定义事件。

image.png

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

image.png

里面有个方法publishEvent(new ContextRefreshedEvent)

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

image.png

返回listener回调onApplicationEvent方法。

  • 自定义发布事件

自己调用publshEvent方法。


事件派发器getApplicationEventMulticaster详解


refresh方法刷新。

initApplicationEventMulticaster方法。

image.png

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

image.png

  • 容器中有哪些监听器
  1. refresh()方法里面有个注册所有的监听器registerListener。
  2. image.png

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

image.png

相关文章
|
6天前
|
小程序 数据可视化 Java
Java+后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码
UWB定位系统由硬件定位设备、定位引擎和应用软件组成。该定位系统应用软件支持PC端和移动端访问,并提供位置实时显示、历史轨迹回放、人员考勤、电子围栏、行为分析、智能巡检等功能。定位精度高达10cm,同时具备高动态、高容量、低功耗的优点。应用场景包括:隧道、化工、工厂、煤矿、工地、电厂、养老、展馆、整车、机房、机场等。
31 8
|
1天前
|
监控 Java API
【监控】spring actuator源码速读
【监控】spring actuator源码速读
6 1
|
2天前
|
监控 Java 关系型数据库
java版MES系统源码,后端采用 Spring Boot 多模块架构
MES系统采用Vue3的vue-element-plus-admin为后台,Spring Boot多模块架构,支持MySQL、Oracle等数据库,具备SaaS多租户功能。核心功能包括车间计划排程、工艺流程配置、生产质量管理、进度追踪、库存和排班管理等,全面覆盖生产运营关键环节。
java版MES系统源码,后端采用 Spring Boot 多模块架构
|
2天前
|
Java Spring
Spring源码学习——(二)
第二讲——了解BeanFactory的功能
|
2天前
|
Java Spring 容器
Spring源码学习——(一)
第一讲——了解BeanFactory和ApplicationContext
|
7天前
|
XML 存储 Java
Spring 6(一)【Spring 入门】
Spring 6(一)【Spring 入门】
|
8天前
|
Java 数据库连接 数据库
Spring日志完结篇,MyBatis操作数据库(入门)
Spring日志完结篇,MyBatis操作数据库(入门)
|
10天前
|
存储 自动驾驶 Java
Spring IoC&DI(1)—入门
Spring IoC&DI(1)—入门
11 1
|
10天前
|
JSON 前端开发 Java
Spring Web MVC入门(3)——响应
Spring Web MVC入门(3)——响应
12 1
|
10天前
|
存储 前端开发 Java
Spring Web MVC入门(2)——请求(下)
Spring Web MVC入门(2)——请求
16 0