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);
+            }
+        }
+    }
 }

Reply via email to