This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new 4427babc65 Implement Injector.dispose() and add cleanup test (#10903)
4427babc65 is described below

commit 4427babc6549380b516cf5ef20e59b8377daacb5
Author: Arturo Bernal <[email protected]>
AuthorDate: Thu Jul 17 07:53:45 2025 +0200

    Implement Injector.dispose() and add cleanup test (#10903)
    
    Dispose() clears all internal state including bindings, scopes, singleton 
caches, and loaded URLs
    Add unit test verifying that injector no longer provides disposed bindings
---
 .../main/java/org/apache/maven/di/Injector.java    | 12 +++++++++
 .../org/apache/maven/di/impl/InjectorImpl.java     | 20 +++++++++++++++
 .../org/apache/maven/di/impl/InjectorImplTest.java | 30 ++++++++++++++++++++++
 .../maven/api/di/testing/MavenDIExtension.java     |  3 +--
 4 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/impl/maven-di/src/main/java/org/apache/maven/di/Injector.java 
b/impl/maven-di/src/main/java/org/apache/maven/di/Injector.java
index 8a95f0fd6f..39810eb08e 100644
--- a/impl/maven-di/src/main/java/org/apache/maven/di/Injector.java
+++ b/impl/maven-di/src/main/java/org/apache/maven/di/Injector.java
@@ -161,4 +161,16 @@ static Injector create() {
      */
     @Nonnull
     <T> T getInstance(@Nonnull Key<T> key);
+
+    /**
+     * Disposes this Injector, clearing all internal state (bindings, caches, 
scopes, etc.).
+     * After calling this, the Injector should not be used again.
+     * @since 4.1
+     */
+    default void dispose() {
+        // delegate to the implementation
+        if (this instanceof InjectorImpl) {
+            ((InjectorImpl) this).dispose();
+        }
+    }
 }
diff --git 
a/impl/maven-di/src/main/java/org/apache/maven/di/impl/InjectorImpl.java 
b/impl/maven-di/src/main/java/org/apache/maven/di/impl/InjectorImpl.java
index c3a069bca5..1b16b1b22e 100644
--- a/impl/maven-di/src/main/java/org/apache/maven/di/impl/InjectorImpl.java
+++ b/impl/maven-di/src/main/java/org/apache/maven/di/impl/InjectorImpl.java
@@ -456,4 +456,24 @@ public T get() {
                     });
         }
     }
+
+    /**
+     * Release all internal state so this Injector can be GC’d
+     * (and so that subsequent tests start from a clean slate).
+     * @since 4.1
+     */
+    public void dispose() {
+        // First, clear any singleton‐scope caches
+        scopes.values().stream()
+                .map(Supplier::get)
+                .filter(scope -> scope instanceof SingletonScope)
+                .map(scope -> (SingletonScope) scope)
+                .forEach(singleton -> singleton.cache.clear());
+
+        // Now clear everything else
+        bindings.clear();
+        scopes.clear();
+        loadedUrls.clear();
+        resolutionStack.remove();
+    }
 }
diff --git 
a/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java 
b/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java
index f02eb011d9..fff936fdfa 100644
--- a/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java
+++ b/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java
@@ -475,4 +475,34 @@ static class MediumPriorityServiceImpl implements 
MyService {}
         @Named
         static class DefaultPriorityServiceImpl implements MyService {}
     }
+
+    @Test
+    void testDisposeClearsBindingsAndCache() {
+        final Injector injector = Injector.create()
+                // bind two simple beans
+                .bindImplicit(DisposeTest.Foo.class)
+                .bindImplicit(DisposeTest.Bar.class);
+
+        // make sure they really get created
+        assertNotNull(injector.getInstance(DisposeTest.Foo.class));
+        assertNotNull(injector.getInstance(DisposeTest.Bar.class));
+
+        // now dispose
+        injector.dispose();
+
+        // after dispose, bindings should be gone => DIException on lookup
+        assertThrows(DIException.class, () -> 
injector.getInstance(DisposeTest.Foo.class));
+        assertThrows(DIException.class, () -> 
injector.getInstance(DisposeTest.Bar.class));
+    }
+
+    /**
+     * Simple test classes for dispose().
+     */
+    static class DisposeTest {
+        @Named
+        static class Foo {}
+
+        @Named
+        static class Bar {}
+    }
 }
diff --git 
a/impl/maven-testing/src/main/java/org/apache/maven/api/di/testing/MavenDIExtension.java
 
b/impl/maven-testing/src/main/java/org/apache/maven/api/di/testing/MavenDIExtension.java
index 12de0178d1..67e2c71486 100644
--- 
a/impl/maven-testing/src/main/java/org/apache/maven/api/di/testing/MavenDIExtension.java
+++ 
b/impl/maven-testing/src/main/java/org/apache/maven/api/di/testing/MavenDIExtension.java
@@ -124,8 +124,7 @@ protected void setupContainer() {
     @Override
     public void afterEach(ExtensionContext context) throws Exception {
         if (injector != null) {
-            // TODO: implement
-            // injector.dispose();
+            injector.dispose();
             injector = null;
         }
     }

Reply via email to