This is an automated email from the ASF dual-hosted git repository. reta pushed a commit to branch 3.5.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 4145645ffe25b0f0ffb334ab538e8b74a6d1c72b Author: Eric Giese <[email protected]> AuthorDate: Tue Mar 7 14:37:55 2023 +0100 [CXF-8745] The ApplicationListener, which redirects all ApplicationEvents to the SpringBus, now uses a WeakReference to allow a GC if the SpringBus is no longer in use because it's corresponding context has been closed. (#1077) --- .../java/org/apache/cxf/bus/spring/SpringBus.java | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/apache/cxf/bus/spring/SpringBus.java b/core/src/main/java/org/apache/cxf/bus/spring/SpringBus.java index 0c625e4fc6..4f6caace4b 100644 --- a/core/src/main/java/org/apache/cxf/bus/spring/SpringBus.java +++ b/core/src/main/java/org/apache/cxf/bus/spring/SpringBus.java @@ -19,6 +19,8 @@ package org.apache.cxf.bus.spring; +import java.lang.ref.WeakReference; + import org.apache.cxf.bus.extension.ExtensionManagerBus; import org.apache.cxf.configuration.ConfiguredBeanLocator; import org.apache.cxf.configuration.Configurer; @@ -60,12 +62,7 @@ public class SpringBus extends ExtensionManagerBus /** {@inheritDoc}*/ public void setApplicationContext(ApplicationContext applicationContext) { ctx = (AbstractApplicationContext)applicationContext; - @SuppressWarnings("rawtypes") - ApplicationListener listener = new ApplicationListener() { - public void onApplicationEvent(ApplicationEvent event) { - SpringBus.this.onApplicationEvent(event); - } - }; + SpringBusApplicationListener listener = new SpringBusApplicationListener(this); ctx.addApplicationListener(listener); ApplicationContext ac = applicationContext.getParent(); while (ac != null) { @@ -150,4 +147,22 @@ public class SpringBus extends ExtensionManagerBus closeContext = b; } + private static class SpringBusApplicationListener implements ApplicationListener<ApplicationEvent> { + + // Using a WeakReference ensures that the Listener does not prevent a SpringBus from being free'd + // This can happen in parent-child context constellations, where the Listener is recursively added + private final WeakReference<SpringBus> springBusReference; + + SpringBusApplicationListener(SpringBus springBus) { + this.springBusReference = new WeakReference<>(springBus); + } + + @Override + public void onApplicationEvent(ApplicationEvent event) { + final SpringBus springBus = springBusReference.get(); + if (springBus != null) { + springBus.onApplicationEvent(event); + } + } + } }
