Spring事件监控机制的源代码分析

1.Spring事件监控系统包括三个组件:事件、事件监听器和事件广播器。

Event:要定义事件类型和事件源,需要继承ApplicationEvent。

事件监听器:用于监听某类事件,执行特定的业务逻辑。您需要实现ApplicationListener接口或者用@ListenerEvent(T)对其进行注释。就像观察者模式下的观察者。

事件组播:负责广播和通知所有监听器,所有事件监听器都在事件组播中注册。就像在观察者模式下观察到的一样。默认情况下,Spring容器生成同步事件多播。您可以自定义事件多播,它被定义为异步模式。

在创建AnnotationConfigApplicationContext的过程中,将执行refresh()中的initapplicationEventMasterer()方法。该方法首先获取bean工厂,然后确定该工厂是否包含beanName为applicationEventMulticaster的bean。如果是,获取bean并将其分配给applicationEventMulticaster属性。如果没有,请创建一个simpleapplicationEventMulticaster对象,并将其分配给applicationeventmaster。源代码实现如下:

有两种注册侦听器的方法,通过实现ApplicationListener接口或添加@EventListener注释。

注册的逻辑是在refresh()的registerListeners()方法中实现的。第一步是获取当前ApplicationContext中已经添加的应用程序侦听器(在Spring MVC源代码中使用),并遍历它们并将其添加到多播中。第二步是获取实现ApplicationListener接口的listenerBeanNames集合,并将其添加到多播中。第三步,判断是否有早间事件,如果有,发起广播。

想一想,上面代码的第二步为什么要添加listenerBeanName?

如果听者懒(也就是有@Lazy评论)。那么这个时候创建监听器显然是错误的。此时您不能创建侦听器。因此,将侦听器添加到多播的特定逻辑是在初始化特定侦听器之后进行的。通过BeanPostProcessor的接口。具体实现类是ApplicationListenerDetector。该类被添加到refreah()中的prepareBeanFactory()方法中。代码如下:

在创建AnnotationConfigApplicationContext的构造方法中,将会执行org . spring framework . context . annotation . annotationconfig utils # registerannotationconfigprocessors(org . spring framework . beans . factory . support . bean definition registry,java.lang.object)的方法。这个方法将添加两个beanDefs,代码如下:

EventListener method processor:event listener的BeanFactory后处理器,前期会创建DefaultEventListenerFactory,后期创建Bean后,会调用DefaultEventListenerFactory,根据event listener属性创建一个具体的applicationlistener method adapter。

DefaultEventListenerFactory:创建侦听器的工厂,用于创建ApplicationListenerMethodDapter。

EventListenerMethodProcessor的类继承关系图如下:

将在refreash的invokebeanfactorypostprocessors()中调用org . spring framework . context . event . eventlistenermethodprocessor # postprocessbean factory方法来获取EventListenerFactory类型的bean。代码如下:

在org . spring framework . beans . factory . support . defaultlistablebeanfactory # preinstatitesingletons的方法中,在创建了所有的singleton beans之后,它将遍历是否所有的bean都实现了SmartInitializingSingleton接口。如果实现了接口,将执行Bean的afterSingletonsInstantiated()方法。代码如下:

org . spring framework . context . event . eventlistenermethodprocessor # afteringletonstanted将调用私有方法processBean()来创建ApplicationEventAdatper。代码如下:

可以通过调用org . spring framework . context . support . abstractapplicationcontext # publish event(Java . lang . object,org . spring framework . core . resolvable type)的方法调用事件。代码如下:

SimpleApplicationEventMasterer中multicasEvent、invokeListener和doInvokeListener的代码如下:

在SpringMVC中,通过Spring的事件机制来初始化9个组件。

侦听器在FrameworkServlet类中定义为内部类。代码如下:

监听器被添加到org中。spring framework . web . servlet . framework servlet # configureandrefreshwabaapplicationcontext。通过SourceFilteringListener打包。添加如下代码:

在refresh中的registerListeners的方法中添加,代码如下:

在Refresh中的finishRefresh()方法中,调用publishevnet(New context refresh Event(this))发布事件。组播广播,代码如下

最终会传输到frameworkservlet . this . on application event(event)。