在之前了解Spring的订阅与发布是如何使用以后,我们来看Spring是如何实现订阅与发布。Spring的订阅与发布主要分为四个模块:
- 注册事件广播器
ApplicationEventMulticaster
- 注册事件监听器
ApplicationEventListener
- 发布事件
- 处理监听事件
注册事件广播器
Spring在注册事件广播器时,会调用 AbstractApplicationContext#refresh
方法。这个方法是用来初始化容器的,这个方法会注册Bean对象、初始化Bean对象等等,这里只需要关注 initApplicationEventMulticaster()
方法,这个方法就是用来注册事件广播器的。来看一下这个方法的实现。
protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
if (beanFactory.containsLocalBean("applicationEventMulticaster")) {
this.applicationEventMulticaster = (ApplicationEventMulticaster)beanFactory.getBean("applicationEventMulticaster", ApplicationEventMulticaster.class);
}
} else {
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton("applicationEventMulticaster", this.applicationEventMulticaster);
}
}
}
这个方法两件事:
-
当前容器已经注册了名为
applicationEventMulticaster
的对象,直接获取这个已经注册好的事件广播器。例如,我们通过配置类去提前配置事件广播器对象。@Configuration public class AsynchronousSpringEventsConfig { @Bean(name = "applicationEventMulticaster") public ApplicationEventMulticaster applicationEventMulticaster() { SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster(); multicaster.setTaskExecutor(new SimpleAsyncTaskExecutor()); return multicaster; } }
-
如果当前容器没有提前配置,那么当前容器获取不到这个事件广播器对象,需要由Spring自己创建一个
SimpleApplicationEventMulticaster
对象,并把它注册到容器中。SimpleApplicationEventMulticaster
是Spring默认事件广播器。
注册事件监听器
加载事件监听器
Spring是如何加载我们自定义的监听器的呢?自定义的事件监听器是由Spring的 ApplicationListenerDetector
后置处理器的 postProcessAfterInitialization
方法加载的。具体源码如下所示。
class ApplicationListenerDetector implements DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor {
@Override
public Object postProcessAfterInitialization(Object