From 1611ce7180b985084e60abc116f32d5db886808d Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 2 Nov 2017 16:07:12 +0100 Subject: [PATCH] AbstractApplicationContext silently ignores non-initialized ApplicationEventMulticaster/LifecycleProcessor on destruction Issue: SPR-16149 --- .../support/AbstractApplicationContext.java | 14 ++++++++------ .../support/ApplicationListenerDetector.java | 11 ++++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java b/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java index 276ac7cec5b..31b4a02c775 100644 --- a/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java @@ -387,7 +387,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader else { applicationEvent = new PayloadApplicationEvent<>(this, event); if (eventType == null) { - eventType = ((PayloadApplicationEvent)applicationEvent).getResolvableType(); + eventType = ((PayloadApplicationEvent) applicationEvent).getResolvableType(); } } @@ -1000,11 +1000,13 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader } // Stop all Lifecycle beans, to avoid delays during individual destruction. - try { - getLifecycleProcessor().onClose(); - } - catch (Throwable ex) { - logger.warn("Exception thrown from LifecycleProcessor on context close", ex); + if (this.lifecycleProcessor != null) { + try { + this.lifecycleProcessor.onClose(); + } + catch (Throwable ex) { + logger.warn("Exception thrown from LifecycleProcessor on context close", ex); + } } // Destroy all cached singletons in the context's BeanFactory. diff --git a/spring-context/src/main/java/org/springframework/context/support/ApplicationListenerDetector.java b/spring-context/src/main/java/org/springframework/context/support/ApplicationListenerDetector.java index 62b29b6aca6..4c3a9612871 100644 --- a/spring-context/src/main/java/org/springframework/context/support/ApplicationListenerDetector.java +++ b/spring-context/src/main/java/org/springframework/context/support/ApplicationListenerDetector.java @@ -92,9 +92,14 @@ class ApplicationListenerDetector implements DestructionAwareBeanPostProcessor, @Override public void postProcessBeforeDestruction(Object bean, String beanName) { if (bean instanceof ApplicationListener) { - ApplicationEventMulticaster multicaster = this.applicationContext.getApplicationEventMulticaster(); - multicaster.removeApplicationListener((ApplicationListener) bean); - multicaster.removeApplicationListenerBean(beanName); + try { + ApplicationEventMulticaster multicaster = this.applicationContext.getApplicationEventMulticaster(); + multicaster.removeApplicationListener((ApplicationListener) bean); + multicaster.removeApplicationListenerBean(beanName); + } + catch (IllegalStateException ex) { + // ApplicationEventMulticaster not initialized yet - no need to remove a listener + } } }