If a binding has two equivalent ProvisionListeners, only fire one of them.
---
.../inject/internal/ProvisionListenerStackCallback.java | 9 ++++++---
core/test/com/google/inject/ProvisionListenerTest.java | 13 +++++++++++++
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git
a/core/src/com/google/inject/internal/ProvisionListenerStackCallback.java
b/core/src/com/google/inject/internal/ProvisionListenerStackCallback.java
index a99c513..45347f0 100644
--- a/core/src/com/google/inject/internal/ProvisionListenerStackCallback.java
+++ b/core/src/com/google/inject/internal/ProvisionListenerStackCallback.java
@@ -16,14 +16,16 @@
package com.google.inject.internal;
+import java.util.List;
+import java.util.Set;
+
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
import com.google.inject.Binding;
import com.google.inject.ProvisionException;
import com.google.inject.spi.DependencyAndSource;
import com.google.inject.spi.ProvisionListener;
-import java.util.List;
-
/**
* Intercepts provisions with a stack of listeners.
*
@@ -49,7 +51,8 @@ final class ProvisionListenerStackCallback<T> {
if (listeners.isEmpty()) {
this.listeners = EMPTY_LISTENER;
} else {
- this.listeners = listeners.toArray(new
ProvisionListener[listeners.size()]);
+ Set<ProvisionListener> deDuplicated = Sets.newLinkedHashSet(listeners);
+ this.listeners = deDuplicated.toArray(new
ProvisionListener[deDuplicated.size()]);
}
}
diff --git a/core/test/com/google/inject/ProvisionListenerTest.java
b/core/test/com/google/inject/ProvisionListenerTest.java
index 478949f..54a11fa 100644
--- a/core/test/com/google/inject/ProvisionListenerTest.java
+++ b/core/test/com/google/inject/ProvisionListenerTest.java
@@ -694,4 +694,17 @@ public class ProvisionListenerTest extends TestCase {
this.x = xProvider.get();
}
}
+
+ public void testDeDuplicateProvisionListeners() {
+ final Counter counter = new Counter();
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ @Override
+ protected void configure() {
+ bindListener(Matchers.any(), counter);
+ bindListener(Matchers.any(), counter);
+ }
+ });
+ injector.getInstance(Many.class);
+ assertEquals("ProvisionListener not de-duplicated", 1, counter.count);
+ }
}
--
1.8.4.2
--
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice.
For more options, visit https://groups.google.com/groups/opt_out.