Spring源码(四):深入Spring事件监听器

15 篇文章 0 订阅

        Spring的事件监听(也称事件驱动)是观察者模式的一种实现,比较常见的有发布-订阅模型。通常我们利用消息队列来实现不同系统之间的解耦,如用户登录完成后,可以向消息队列发布一条消息,然后订阅了此topic的子系统收到发布的消息之后,就会做相应的处理。这样做的好处是避免了服务与服务之间的耦合,并且,执行子系统的业务将会异步执行,互不影响。事件监听器模型如下图:

一: 事件机制的主要成员:

        事件发布器(ApplicationEventPublisher):用于发布事件

        事件监听器(ApplicationListener): 监听事件触发,做后续业务处理

        事件(ApplicationEvent): 一般用于自定义事件类型

        javaSE 提供了一系列自定义事件的标准。

                EvenObject,为javaSE提供的事件类型基类,任何自定义事件都必须继承它。

                EventListener,为javaSE提供的事件监听器基类,任何自定义事件监听器都得实现。

                javaSE未提供事件发布者,由各个应用程序自行实现事件发布者这一角色。

       spring提供了ApplicationEventPublisher接口作为我们事件的发布者。ApplicationContext实现了这个接口,所以ApplicationContext具有发布事件的功能。

       spring提供了ApplicationEventMulticaster接口,负责管理ApplicationListener和发布ApplicationEvent。ApplicationContext接口会把事件的相关工作委托给ApplicationEventMulticaster的实现类做。

        三个主要成员的类继承关系,如下图

二:Spring广播器的注入 

         1.ApplicationEventMulticaster的实例化;

                调用了initApplicationEventMulticaster方法完成了事件广播器的实例化:

                 先看Spring容器中是否已经存在一个事件广播器,如果存在,直接中SpringBean工厂获取ApplicationEventMulticaster对象;如果不存在,直接new一个默认的SimpleApplicationEventMulticaster类型的ApplicationEventMulticaster对象并添加到单例池对象中。这个就有一个扩展点:可以注入我们自己的ApplicationEventMulticaster对象。

       2.ApplicationListener的注入

                ApplicationListener注册有三种方式:

                1)调用了registerListeners方法完成了默认监听器的注册:

                 2)BeanPostProcessor扩展点ApplicationListenerDetector完成了自定义监听器的注册;先看bean对象是否ApplicationListener类型,如果是,调用applicationContext的addApplicationListener((ApplicationListener<?>) bean)方法完成了监听器的注册。

                 3)单例对象初始化完成后,对Bean对象方法上有@EventListener注解的支持完成ApplicationListener的注册。

        3.事件的发布流程

            ApplicationContext实现了ApplicationEventPublisher发布器,那么ApplicationContext就有事件发布的功能,所以我们可以使用ApplicationContext进行事件发布。 下面看一下事件发布的源码:

                 这个接口有两个方法,方法名一样,参数不一样,一个接收的参数是ApplicationEvent事件对象、一个接收的参数是Object对象。

                接下来看一下事件发布调用链的具体逻辑:

                 ApplicationContext.publishEvent()方法调到了父类的publishEvent()方法。首先把事件封装成了ApplicationEvent类型,然后获取广播器(ApplicationEventMulticaster)并调用multicastEvent方法。 

         在注册广播器的事件我们知道,spring默认的广播器是SimpleApplicationEventMulticaster。

先根据类型解析器获取指定的一批监听器,然后轮询获取线程池调用监听器onApplicationEvent方法完成事件。

        有一个非常重要的点:每个事件再调用监听器前都先获取线程池对象,如果线程池对象存在,通过线程池开辟一个线程调用监听器;如果线程池对象不存在,则直接调用。从这段代码可以看出:如果我们指定了线程池,那么整个事件就是异步执行的,否则就是同步执行。所以我们可以根据具体业务类型是否需要使用异步执行事件。

        至此,整个Spring事件机制已经介绍完了...

            编译好的Spring源码

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java的艺术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值