什么是事件/监听
监听/事件机制其实是由Spring实现的一种事件/监听器模式,可视为观察者模式。在Spring应用上下文ApplicationContext广播事件之后,监听器监听到后会做出相应事件的处理。
相应在SpringBoot中,在充分使用到Spring的ApplicationListener的同时也实现了SpringBoot的监听器SpringApplicationRunListener,实现了自己的事件/监听机制。本文具体介绍Spring下的事件/监听机制,SpringApplicationRunListener就不再展开了。
ApplicationListener 属于 org.springframework.context包下。
SpringApplicationRunListener属于 org.springframework.boot包下。
SpringBoot下的监听器
大家都知道SpringBoot是由SpringApplication.run()方法启动的,在SpringApplication的构造函数中,可以看到调用了一个名为setListeners的函数,该函数会将META-INF/spring.factories下所有的监听器加入到listeners属性中。
private List<ApplicationListener<?>> listeners;
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
// 将META-INF/spring.factories下所有的监听器加入到listeners属性中
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
public void setListeners(Collection<? extends ApplicationListener<?>> listeners) {
this.listeners = new ArrayList<>();
this.listeners.addAll(listeners);
}
这个监听器列表会在org.springframework.context.support.AbstractApplicationContext#registerListeners 方法中被遍历添加进org.springframework.context.event.AbstractApplicationEventMulticaster.ListenerRetriever#applicationListeners 属性中。
protected void registerListeners() {
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);