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