likes
comments
collection
share

spring源码分析事件原理图文详解

作者站长头像
站长
· 阅读数 15

概述

说到事件,大家多少都是首先想到消息中间件,比如kafka,rabbitmq等。spring中也支持事件,分为事件发送和时间监听。spring事件机制原理本质其实就是调用事件发送方法,然后直接回调容器中listener对象。说到这里,大家应该明白,spring事件机制是依赖于当前容器的,说明白点就是一个单机版事件机制。那么使用场景也就是spring容器生命周期的事件应用。

参考资料

代码示例

//定义事件发布器
@Component
public class EventPublisher {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void Publish(){
        applicationEventPublisher.publishEvent(new EventTest("hello"));
    }

    private static class EventTest extends ApplicationEvent {
        private String msg;

        public EventTest(String msg) {
            super(msg);
            this.msg = msg;
        }
    }

}

//定义事件监听器
@Component
public class MyEventListener {

    @EventListener(classes = {ApplicationEvent.class})
    public void eventHandle(Object o){
        System.out.println("监听到事件"+o);
    }

}

初始化事件处理相关组件

spring源码分析事件原理图文详解 初始化组件根据经验,一般就是三个阶段干预,一个是bean创建前注册bean,一个是bean创建时(是否代理之类),一个是bean创建完成后。EventListenerMethodProcessor实现了BeanFactoryPostProcessor(第一阶段),SmartInitializingSingleton接口(第三阶段),在bean创建后,将@EventListener都封装为ApplicationListenerMethodAdapter对象,保存在容器中,当发生事件发布,那么直接回调这些Listener对象方法,即完成事件发送和时间处理的一套机制

监听器对象创建和初始化(扫描标注@EventListener方法)

spring源码分析事件原理图文详解 preInstantiateSingletons是fresh()方法创建单例bean的方法,创建完成后,我们看到还会对 SmartInitializingSingleton(EventListenerMethodProcessor)类型bean进行回调

spring源码分析事件原理图文详解

spring源码分析事件原理图文详解

spring源码分析事件原理图文详解

看到这里,其实原理也很简单。就是将所有的bean对象进行遍历,含有@EventListener都封装为ApplicationListenerMethodAdapter对象,然后保存到容器applicationListeners集合中

事件发布的执行流程分析

spring源码分析事件原理图文详解

spring源码分析事件原理图文详解

原理很简单,当调用publishEvent方法,其实就是applicationContext的事件发布方法,然后获取到 上面创建的监听器对象,遍历所有监听器对象进行回调

应用场景

上面分析完原理,我们就已经发现了,实现事件发布和订阅其实都是依赖spring容器的,也就是说只适合在容器内部使用,完全不是我们理解的消息中间件。

扩展

1.事件发布订阅是一个典型的观察者模式

2.spring事件机制是单机的,只适合容器相关事件处理,有利于代码解耦

3.spring容器有三个重要接口BeanFactoryPostProcessor(bean实例化前),BeanPostProcessor((bean实例化时)),SmartInitializingSingleton(bean实例化后)

总结

spring事件机制当做一个了解,使用情况很少,主要是加深我们对spring底层原理,代码涉及理解的加深

转载自:https://juejin.cn/post/7065914247250706439
评论
请登录