Spring Boot 事件监听机制工作原理

前言:

我们知道在 Spring 、Spring Boot 的启动源码中都大量的使用了事件监听机制,也就是我们说的的监听器,监听器的实现基于观察者模式,也就是我们所说的发布订阅模式,这种模式可以在一定程度上实现代码的解耦,但如果想要实现系统层面的解耦,那么就要使用消息队列了,本篇从详细分析一下监听器的原理。

Spring Boot 系列文章传送门

Spring Boot 启动流程源码分析(2)

Spring Boot 启动流程源码分析(2)

Spring Boot 自动配置实现原理(源码分析)

Spring Boot 自定义 starter 启动器

事件监听器的核心元素

  • 事件(ApplicationEvent):监听器触发的原因,当事件源发生了某个事件,对应的监听器就会被触发,Spring 中场常见的事件 ContextRefreshEvent、ContextRStartEvent、ContextStoppedEvent、ContextCloseEvent、ReqyestHandlerEvent 等事件。
  • 监听器(ApplicationListener):监听特定事件,并在事件内部定义了事件发生后的响应逻辑,对应观察者模式的观察者。
  • 事件发布器(ApplicationEventMulticaster):负责发布事件,维护事件和事件监听器之间的关系,并在事件发生时通知相关监听器,对应观察者模式中的被观察者。

监听器的工作流程

  1. 事件监听器注册到事件发起器,用于监听事件。
  2. 事件源产生事件,然后像发布器发布事件。
  3. 事件发布器回调事件监听器的回调方法。
  4. 事件监听器的回调方法被调用,执行业务。

事件发布器的初始化时机

事件发布器又叫事件多播器,我们分析了事件监听器的工作流程,其中事件监听器是要往事件发布器中注册的,那意味着事件监听器开始注册之前已经有了事件发布器,那事件发布器是什么时候初始化的呢?事件发布器是在 AbstractApplicationContext#refresh 方法中调用了 AbstractApplicationContext#registerListeners 方法,完成事件发布器的初始化,如下:

//初始化一个事件多播器
protected void initApplicationEventMulticaster() {
   
    //获取 beanFactory
    ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
    //beanFactory 中是否有 应用程序事件多播器
    if (beanFactory.containsLocalBean("applicationEventMulticaster")) {
   
        //有直接赋值
        this.applicationEventMulticaster = (ApplicationEventMulticaster)beanFactory.getBean("applicationEventMulticaster", ApplicationEventMulticaster.class);
        if (this.logger.isTraceEnabled()) {
   
            this.logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
        }
    } else {
   
        //没有就创建一个 应用程序事件多播器
        this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
        //应用程序事件多播器 注册到 beanFactory 中
        beanFactory.registerSingleton("applicationEventMulticaster", this.applicationEventMulticaster);
        if (this.logger.isTraceEnabled()) {
   
            this.logger.trace("No 'applicationEventMulticaster' bean, using [" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
        }
    }

}

事件监听器的注册时机

事件监听器需要注册到事件发布器中,那事件监听器是设么时候注册的?监听器的注册是在 Spring 容器刷新的时候完成的,AbstractApplicationContext#refresh 方法中调用了 AbstractApplicationContext#registerListeners 方法完成注册,如下:

//注册监听器
protected void registerListeners() {
   
    //准备遍历监听器
    Iterator var1 = this.getApplicationListeners().iterator()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值