Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文读懂Spring事件机制

一文读懂Spring事件机制

作者头像
程序猿杜小头
发布于 2022-12-01 13:39:06
发布于 2022-12-01 13:39:06
68300
代码可运行
举报
文章被收录于专栏:程序猿杜小头程序猿杜小头
运行总次数:0
代码可运行

一文读懂Spring事件机制

Spring 事件机制是为同一ApplicationContext中多个Bean之间的通信而设计的,它是观察者模式的一个典型应用。

观察者模式在生活中随处可见,比如:在安装有交通信号灯的路口,行人需要实时观察信号灯的变化,从而判断是否需要前进、缓行或等待;而信号灯只负责发布信号变更事件,并不会干预行人,也就是说信号灯与行人之间是松耦合的关系。

为什么要搞清楚 Spring 事件机制呢?因为这玩意儿在 Spring 内部应用广泛,不搞清楚的话,看 Spring 相关源码会是一个拦路虎;此外,也可以在实际工作中解决相关问题,比如:笔者在工作中曾借助它来实现流程节点的自动流转,这些业务流程往往很长,但只有少数流程节点需要客户手动触发完成,其余节点需要自动流转。

1 从实战出发

聊到事件机制,那就不得不提事件处理模型三要素了,即事件源、事件和事件监听器。

1.1 定义事件

在 Spring 4.2 之前,所有事件均需要继承自ApplicationEvent,而 ApplicationEvent 又继承自java.util.EventObject;但在 Spring 4.2 之后,并不强制要求自定义事件继承 ApplicationEvent,因为 Spring 会将开发者自定义的事件类包装为一个PayloadApplicationEvent,其实,PayloadApplicationEvent 同样继承自 ApplicationEvent。

1.2 定义事件监听器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 事件监听器,即行人
@Component
@Slf4j
public class CustomTrafficSignalListener implements ApplicationListener<TrafficSignalEvent> {
    @Override
    public void onApplicationEvent(TrafficSignalEvent trafficSignalEvent) {
        if (trafficSignalEvent instanceof RedSignalEvent) {
            log.info("红灯亮,请所有行人和车辆停止前行");
        } else if (trafficSignalEvent instanceof GreenSignalEvent) {
            log.info("绿灯亮,请所有行人和车辆前行");
        } else if (trafficSignalEvent instanceof YellowSignalEvent) {
            log.info("黄灯亮,请所有行人和车辆缓行");
        } else {
            throw new IllegalStateException("未知的信号灯事件");
        }
    }
}

Spring 4.2 提供了org.springframework.context.event.EventListener注解,不再需要实现org.springframework.context.ApplicationListener接口。相信大家在实际工作中更倾向于使用@EventListener的方式来定义事件监听器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 事件监听器,即行人
@Component
@Slf4j
public class FlexibleTrafficSignalListener {
    @EventListener
    public void onTrafficSignalEvent(TrafficSignalEvent event) {
        if (event instanceof RedSignalEvent) {
            log.info("红灯亮,请所有行人和车辆停止前行");
        } else if (event instanceof GreenSignalEvent) {
            log.info("绿灯亮,请所有行人和车辆前行");
        } else if (event instanceof YellowSignalEvent) {
            log.info("黄灯亮,请所有行人和车辆缓行");
        } else {
            throw new IllegalStateException("未知的信号灯事件");
        }
    }
}

1.3 定义事件源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 交通信号灯,即事件源
@Component
public class TrafficSignal implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher applicationEventPublisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    public void doSignal() {
        TrafficSignalEvent redSignalEvent = new RedSignalEvent(this);
        applicationEventPublisher.publishEvent(redSignalEvent);
    }
}

1.4 运行结果

CustomTrafficSignalListener

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2021-08-16 20:59:19.728  INFO 11908 --- [main] p.d.e.e.CustomTrafficSignalListener      : 红灯亮,请所有行人和车辆停止前行

FlexibleTrafficSignalListener

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2021-08-16 20:59:22.135  INFO 17653 --- [main] p.d.e.e.FlexibleTrafficSignalListener    : 红灯亮,请所有行人和车辆停止前行

2 异步事件监听器

默认情况下,事件监听器基于 同步机制 来处理事件,这意味着ApplicationEventPublisherpublishEvent()方法会阻塞,直到所有事件监听器都处理完毕。如果你想指定某一事件监听器基于 异步机制 来处理事件,可以使用@Async注解。当然,也可以通过配置自定义的ApplicationEventMulticaster使得所有事件监听器都基于异步机制处理事件。值得一提的是,全局异步监听所涉及的这一自定义ApplicationEventMulticaster有个坑,即该Bean的名称必须是applicationEventMulticaster,否则不会生效,具体原因下面会分析。

2.1 配置自定义事件广播器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class ApplicationEventMulticasterConfig {
    @Bean
    public ApplicationEventMulticaster applicationEventMulticaster() {
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("event-pool-%d").build();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                0,
                16,
                0L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(24),
                namedThreadFactory,
                new ThreadPoolExecutor.AbortPolicy()
        );
        SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new SimpleApplicationEventMulticaster();
        simpleApplicationEventMulticaster.setTaskExecutor(threadPoolExecutor);
        return simpleApplicationEventMulticaster;
    }
}

2.2 运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2021-08-16 22:05:50.053  INFO 13652 --- [event-pool-11] p.d.e.e.FlexibleTrafficSignalListener    : 红灯亮,请所有行人和车辆停止前行

3 由Spring所发布的预定义事件

Spring 提供了一些预定义的事件,如下图所示:

但有些事件在 ApplicationContext 创建之前就已触发,该如何观测它们呢?

3.1 定义事件监听器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
public class SpringBuiltInEventsListener implements ApplicationListener<ApplicationEvent> {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        log.info("event = {}", event);
    }
}

3.2 向SpringApplication注册事件监听器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication(scanBasePackages = "pers.duxiaotou")
public class DuXiaoTouSpringAopApp {
    public static void main(String[] args) throws Throwable {
        SpringApplication springApplication = new SpringApplication(DuXiaoTouSpringAopApp.class);
        springApplication.addListeners(new SpringBuiltInEventsListener());
        springApplication.run(args);
    }
}

3.3 运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2021-08-18 17:14:43.182  INFO 15624 --- [           main] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent[source=org.springframework.boot.SpringApplication@2a5b3fee]
2021-08-18 17:14:43.291  INFO 15624 --- [           main] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.context.event.ApplicationContextInitializedEvent[source=org.springframework.boot.SpringApplication@2a5b3fee]
2021-08-18 17:14:43.417  INFO 15624 --- [           main] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.context.event.ApplicationPreparedEvent[source=org.springframework.boot.SpringApplication@2a5b3fee]
2021-08-18 17:14:45.865  INFO 15624 --- [   event-pool-0] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent[source=org.springframework.boot.web.embedded.tomcat.TomcatWebServer@4ca6ee9b]
2021-08-18 17:14:45.872  INFO 15624 --- [   event-pool-0] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@54d18072, started on Wed Aug 18 17:14:43 CST 2021]
2021-08-18 17:14:45.873  INFO 15624 --- [   event-pool-0] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.context.event.ApplicationStartedEvent[source=org.springframework.boot.SpringApplication@2a5b3fee]
2021-08-18 17:14:45.873  INFO 15624 --- [   event-pool-0] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.availability.AvailabilityChangeEvent[source=org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@54d18072, started on Wed Aug 18 17:14:43 CST 2021]
2021-08-18 17:14:45.875  INFO 15624 --- [   event-pool-1] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.context.event.ApplicationReadyEvent[source=org.springframework.boot.SpringApplication@2a5b3fee]
2021-08-18 17:14:45.875  INFO 15624 --- [   event-pool-1] p.d.e.e.SpringBuiltInEventsListener      : event = org.springframework.boot.availability.AvailabilityChangeEvent[source=org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@54d18072, started on Wed Aug 18 17:14:43 CST 2021]

4 实现原理

在 Spring 事件机制中,ApplicationEventPublisher负责发布事件,其只定义了两个publishEvent()方法,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ApplicationEventPublisher {
 default void publishEvent(ApplicationEvent event) {
  publishEvent((Object) event);
 }
 void publishEvent(Object event);
}

ApplicationEventPublisher 的实现类几乎都以ApplicationContext结尾,这难道有什么玄机吗?Spring 事件机制是为同一ApplicationContext中多个Bean之间的通信而设计的,而 ApplicationContext 在 Spring 中扮演IoC容器的角色,负责Bean全生命周期管理,那发布事件当然交由ApplicationContext最合适了啊;其中最为重要的非AbstractApplicationContext莫属!废话不多说,上代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class AbstractApplicationContext
        extends DefaultResourceLoader
        implements ConfigurableApplicationContext {
    // 事件广播器的名称必须指定为applicationEventMulticaster,源码中就是这么限定的
    // 如果不按规矩来,那自定义的事件广播器屁用没有
    public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";

    // 事件广播器,负责向所有事件监听器广播事件
    private ApplicationEventMulticaster applicationEventMulticaster;

    private final Object startupShutdownMonitor = new Object();

    @Override
    public void publishEvent(ApplicationEvent event) {
        publishEvent(event, null);
    }
    @Override
    public void publishEvent(Object event) {
        publishEvent(event, null);
    }

    // 发布事件核心逻辑
    protected void publishEvent(Object event, ResolvableType eventType) {
        ApplicationEvent applicationEvent;
        if (event instanceof ApplicationEvent) {
            applicationEvent = (ApplicationEvent) event;
        } else {
            // 如果所发布的事件不是ApplicationEvent类型,那么默认将其包装为ApplicationEvent类型
            applicationEvent = new PayloadApplicationEvent<>(this, event);
            if (eventType == null) {
                eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();
            }
        }
        // 通过事件广播器广播事件,广播给谁?事件监听器
        this.applicationEventMulticaster.multicastEvent(applicationEvent, eventType);
    }

    /**
     * 这个方法容易忽略,请重点关注以下两个方法,相信看了之后应该能解决你的疑惑···
     * 1) initApplicationEventMulticaster()
     * 2) registerListeners()
     */
    @Override
    public void refresh() {
        synchronized (this.startupShutdownMonitor) {
            // ...

            // 初始化事件广播器
            initApplicationEventMulticaster();
            // 注册事件监听器
            registerListeners();

            // ...
        }
    }

    // 初始化事件广播器
    protected void initApplicationEventMulticaster() {
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
            // 如果开发者自定义了名称为applicationEventMulticaster的事件广播器,则优先使用开发者自定义的
            this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
        } else {
            // 如果开发者没有自定义或者定义了名称不是applicationEventMulticaster的事件广播器,则默认使用SimpleApplicationEventMulticaster
            this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
            beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
        }
    }

    // 注册事件监听器
    protected void registerListeners() {
        // 将事件监听器注册到事件广播器中
        // 但这里的事件监听器专指静态事件监听器,即META-INF下spring.factories配置文件中的事件监听器
        // 比如:spring-boot、jasypt-spring-boot等模块中均配置了静态的事件监听器
        for (ApplicationListener<?> listener : getApplicationListeners()) {
            this.applicationEventMulticaster.addApplicationListener(listener);
        }
        
        // 同样是将事件监听器注册到事件广播器中
        // 但这里主要指那些实现ApplicationListener接口的事件监听器哦
        String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
        for (String listenerBeanName : listenerBeanNames) {
            this.applicationEventMulticaster.addApplicationListenerBean(listenerBeanName);
        }
    }
}

从 AbstractApplicationContext 的源码来看,主要交代了两件事:

  1. AbstractApplicationContext 是实现事件发布的真正大佬,但发布事件并没有直接与事件监听器耦合,而是通过事件广播器来桥接;
  2. 当启动 Spring Boot 时会触发针对 ApplicationContext 的refresh()操作,而refresh()首先会初始化事件广播器,然后注册事件监听器;注意:registerListeners()中所涉及的getApplicationListeners()方法其实只是直接拿到事件监听器列表而已,真正从spring.factories配置文件中读取事件监听器的触发时机是在实例化SpringApplication的时候。眼尖的朋友可能会问:由@EventListener定义的事件监听器是如何注册到事件广播器中的呢?的确,这里不涉及基于注解模型的事件监听器的注册工作,这些事件监听器由EventListenerMethodProcessor来完成注册工作,最终会将其封装为ApplicationListenerMethodAdapter类型的监听器,但依然是ApplicationListener的子类。

接下来,自然要来认识一下ApplicationEventMulticaster大佬了。事件广播器不仅负责广播事件,同时主导Spring和开发者所定义的事件监听器的维护工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ApplicationEventMulticaster {
    void addApplicationListener(ApplicationListener<?> listener);
    void addApplicationListenerBean(String listenerBeanName);
    void removeApplicationListener(ApplicationListener<?> listener);
    void removeApplicationListenerBean(String listenerBeanName);
    void removeApplicationListeners(Predicate<ApplicationListener<?>> predicate);
    void removeApplicationListenerBeans(Predicate<String> predicate);
    void removeAllListeners();
    void multicastEvent(ApplicationEvent event);
    void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType);
}

Spring 事件机制默认采用SimpleApplicationEventMulticaster来作为事件广播器,其源码过于直白,这里就直接奉上源码不再解读了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
    // 线程池,用于实现异步监听器
    private Executor taskExecutor;

    private ErrorHandler errorHandler;

    @Override
    public void multicastEvent(ApplicationEvent event) {
        multicastEvent(event, resolveDefaultEventType(event));
    }

    @Override
    public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {
        ResolvableType type = (eventType != null ? eventType : ResolvableType.forInstance(event);
        Executor executor = getTaskExecutor();
        // 事件广播器会遍历所有事件监听器,逐一向其发布事件
        for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
            if (executor != null) {
                executor.execute(() -> invokeListener(listener, event));
            } else {
                invokeListener(listener, event);
            }
        }
    }

    protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event) {
        ErrorHandler errorHandler = getErrorHandler();
        if (errorHandler != null) {
            try {
                doInvokeListener(listener, event);
            }
            catch (Throwable err) {
                errorHandler.handleError(err);
            }
        } else {
            doInvokeListener(listener, event);
        }
    }

    private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {
        try {
            listener.onApplicationEvent(event);
        } catch (ClassCastException ex) {
            throw ex;
        }
    }
}

5 总结

6 参考文档

  1. https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#context-functionality-events
  2. https://refactoring.guru/design-patterns/observer
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿杜小头 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring - 事件监听机制 源码解析
众所周知,Spring Framework在 BeanFactory的基础容器之上扩展为了ApplicationContext上下文。 ApplicationContext处理包含了BeanFactory的全部基础功能之外,还额外提供了大量的扩展功能。
小小工匠
2022/12/18
3700
Spring - 事件监听机制 源码解析
Spring事件机制详解
有的小伙伴可能会觉得 Spring 中的事件机制很神奇,一个地方发消息,另一个地方收消息,跟 MQ 一样。其实,Spring 中的事件本质上就是观察者模式的应用。事件有其便利的一面,但是用多了也容易导致混乱,所以在实际项目中,我们还是要谨慎选择是否使用 Spring 事件。
江南一点雨
2023/12/14
5070
Spring事件机制详解
深度解析Spring事件监听机制
好久没有更新Spring了,今天来分享一下Spring的事件监听机制,之前分享过一篇Spring监听机制的使用,今天从原理上进行解析,Spring的监听机制基于观察者模式,就是就是我们所说的发布订阅模式,这种模式可以在一定程度上实现代码的解耦,如果想要实现系统层面的解耦,那么消息队列就是我们的不二选择,消息队列本身也是发布订阅模式,只是不同的消息队列的实现方式不一样。
小四的技术之旅
2023/09/05
8950
深度解析Spring事件监听机制
一文读懂内部组件解耦神器 Spring Event(Spring 事件)
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/11/03
2.6K0
一文读懂内部组件解耦神器 Spring Event(Spring 事件)
从注解@EventListener和@TransactionalEventListener掌握Spring的事件机制原理 - Java技术债务
Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式;为的就是业务系统逻辑的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。
Java技术债务
2024/06/21
6690
从注解@EventListener和@TransactionalEventListener掌握Spring的事件机制原理 - Java技术债务
Spring学习笔记(4)Spring 事件原理及其应用
事件类也就是定义发送的内容,比如可以通过继承ApplicationContextEvent来自定义一个特定事件类。
归思君
2023/10/16
3480
Spring学习笔记(4)Spring 事件原理及其应用
Spring中的事件
文章目录 1. 简介 2. 事件 2.1. Spring中内置的事件 2.2. 自定义事件 3. 监听器 3.1. 实现ApplicationListener接口 3.2. 使用@EventListener注解 4. 事件发布 4.1. Spring的事件发布类 4.2. 直接注入 4.3. 使用ApplicationEventPublisherAware注入 5. 事件多播器 6. 异步事件 6.1. 使用@Async实现异步 6.2. 自定义事件多播器 7. 源码解析 简介 学过编程语言的肯定知道事
爱撒谎的男孩
2019/12/31
1.3K0
Spring源码浅析——事件和异步事件
观察者模式(Observer Pattern)是一种设计模式,用于在对象之间定义一种一对多的依赖关系,以便当一个对象的状态发生变化时,所有依赖于它的其他对象都能够自动接收通知并做出相应的处理。
用户1413827
2023/11/28
4080
面试官来了:说说你对Spring事件发布&监听源码的理解?
之前做个数据统计的需求,就是用的Spring事件发布与监听机制(用于采集基础数据),今天做个小小的总结。
后台技术汇
2022/05/28
3930
面试官来了:说说你对Spring事件发布&监听源码的理解?
Spring Event 的幕后
Spring Event 基于发布-订阅模式(观察者模式),使得系统中不同模块可以通过事件进行松散耦合的通信,而不需要直接依赖彼此,使用Spring Event,可以轻松实现业务解耦。
闻说社
2024/12/19
770
Spring Event 的幕后
Spring5源码 - 11 Spring事件监听机制_源码篇
相当于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应逻辑
小小工匠
2021/08/17
4070
Spring事件ApplicationEvent源码浅读 - Java技术债务
ApplicationContext 中的事件处理是通过 ApplicationEvent 类和 ApplicationListener 接口提供的。如果将实现了 ApplicationListener 接口的 bean 部署到容器中,则每次将 ApplicationEvent 发布到ApplicationContext 时,都会通知到该 bean,这简直是典型的观察者模式。设计的初衷就是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。
Java技术债务
2024/06/21
990
Spring事件ApplicationEvent源码浅读 - Java技术债务
Spring高手之路15——掌握Spring事件监听器的内部逻辑与实现
在Spring中,ApplicationContext可以形成一个层次结构,通常由主容器和多个子容器组成。一个常见的疑问是:当一个事件在其中一个容器中发布时,这个事件会如何在这个层次结构中传播?
砖业洋__
2023/10/27
8070
Spring高手之路15——掌握Spring事件监听器的内部逻辑与实现
Spring官网阅读(十二)ApplicationContext详解(中)
首先需要说明的是,Spring并没有让ApplicationContext直接继承Resource接口,就像ApplicationContext接口也没有直接继承Environment接口一样。这应该也不难理解,采用这种组合的方式会让我们的类更加的轻量,也起到了解耦的作用。ApplicationContext跟Resource相关的接口的继承关系如下
程序员DMZ
2020/07/06
1.6K0
【Spring源码】Spring Event事件
事件发布/订阅机制在实际项目中很经常用到,一方面可以很容易让我们的代码进行解耦,另一方面可以很方便的进行一对一或一对多的消息通信,是一种常见的观察者设计模式,具有很好的扩展性。今天就来讲一下Spring的事件机制。
有一只柴犬
2024/01/25
4270
【Spring源码】Spring Event事件
Spring事件监听机制
看一下这个方法AbstractApplicationContext.refresh,在IOC源码解析那篇文章已经把这个方法分析完了,所以直接关注事件广播器和事件发布相关的逻辑即可
Java学习录
2019/09/19
1.4K0
spring,springBoot事件
spring的事件的API对应ApplicationEvent。它继承了ava.util.EventObject。显示调用父类构造器传递事件源。
温安适
2020/07/18
9430
spring,springBoot事件
Spring之事件监听(观察者模型)
  本文介绍下Spring中的事件监听,其本质也就是观察者模型(发布/订阅模式),具体的观察者模式参考下文
用户4919348
2019/04/02
9270
Spring之事件监听(观察者模型)
面试了个30岁的程序员,让我莫名其妙的开始慌了
我:使用事件的模式可以对系统进行解耦,事件源发布一个事件,事件监听器可以消费这个事件,而事件源不用关注发布的事件有哪些监听器,这可以可以对系统进行解耦
马士兵的朋友圈
2020/07/31
9290
面试了个30岁的程序员,让我莫名其妙的开始慌了
spring5.x-监听器原理及源码实现
Spring框架的事件机制允许对象在特定的事件发生时进行监听和响应。Spring监听器的原理主要涉及以下几个核心概念:
逍遥壮士
2023/09/01
2750
spring5.x-监听器原理及源码实现
相关推荐
Spring - 事件监听机制 源码解析
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验