diff --git a/inject-test/src/test/java/org/example/coffee/qualifier/MegaStoreManager.java b/inject-test/src/test/java/org/example/coffee/qualifier/MegaStoreManager.java new file mode 100644 index 000000000..0c2ef65e8 --- /dev/null +++ b/inject-test/src/test/java/org/example/coffee/qualifier/MegaStoreManager.java @@ -0,0 +1,18 @@ +package org.example.coffee.qualifier; + +import jakarta.inject.Singleton; + +@Singleton +public class MegaStoreManager { + + final SomeStore green; + final SomeStore blue; + final SomeStore noQualifier; + + public MegaStoreManager(@Green SomeStore green, @Blue SomeStore blue, SomeStore noQualifier) { + this.green = green; + this.blue = blue; + this.noQualifier = noQualifier; + } + +} diff --git a/inject-test/src/test/java/org/example/coffee/qualifier/MetaStoreManagerTest.java b/inject-test/src/test/java/org/example/coffee/qualifier/MetaStoreManagerTest.java new file mode 100644 index 000000000..3c458e7ba --- /dev/null +++ b/inject-test/src/test/java/org/example/coffee/qualifier/MetaStoreManagerTest.java @@ -0,0 +1,20 @@ +package org.example.coffee.qualifier; + +import io.avaje.inject.BeanScope; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class MetaStoreManagerTest { + + @Test + void test() { + try (BeanScope context = BeanScope.builder().build()) { + MegaStoreManager manager = context.get(MegaStoreManager.class); + + assertThat(manager.green).isInstanceOf(GreenStore.class); + assertThat(manager.blue).isInstanceOf(BlueStore.class); + assertThat(manager.noQualifier).isInstanceOf(NoNameStore.class); + } + } +} diff --git a/inject-test/src/test/java/org/example/coffee/qualifier/NoNameStore.java b/inject-test/src/test/java/org/example/coffee/qualifier/NoNameStore.java new file mode 100644 index 000000000..1ace02baa --- /dev/null +++ b/inject-test/src/test/java/org/example/coffee/qualifier/NoNameStore.java @@ -0,0 +1,14 @@ +package org.example.coffee.qualifier; + +import jakarta.inject.Singleton; + +// no qualifier on this one +@Singleton +public class NoNameStore implements SomeStore { + + @Override + public String store() { + return "noName"; + } + +} diff --git a/inject-test/src/test/java/org/example/coffee/qualifier/StoreManagerWithNamedTest.java b/inject-test/src/test/java/org/example/coffee/qualifier/StoreManagerWithNamedTest.java index eaff1d811..1c2370663 100644 --- a/inject-test/src/test/java/org/example/coffee/qualifier/StoreManagerWithNamedTest.java +++ b/inject-test/src/test/java/org/example/coffee/qualifier/StoreManagerWithNamedTest.java @@ -20,6 +20,14 @@ void test() { SomeStore greenStore = beanScope.get(SomeStore.class, "green"); SomeStore blueStore = beanScope.get(SomeStore.class, "blue"); + SomeStore unNamedStore = beanScope.get(SomeStore.class); + assertThat(blueStore.store()).isEqualTo("blue"); + assertThat(greenStore.store()).isEqualTo("green"); + assertThat(unNamedStore.store()).isEqualTo("noName"); + assertThat(greenStore).isInstanceOf(GreenStore.class); + assertThat(blueStore).isInstanceOf(BlueStore.class); + assertThat(unNamedStore).isInstanceOf(NoNameStore.class); + Map stores = beanScope.map(SomeStore.class); SomeStore green = stores.get("Green"); @@ -42,7 +50,7 @@ void mapParent() { try (BeanScope beanScope = BeanScope.builder().parent(parent).build()) { Map stores = beanScope.map(SomeStore.class); - assertThat(stores).hasSize(3); + assertThat(stores).hasSize(4); } } } diff --git a/inject/src/main/java/io/avaje/inject/spi/DContextEntry.java b/inject/src/main/java/io/avaje/inject/spi/DContextEntry.java index 1dbb2bd9e..9febe9d0e 100644 --- a/inject/src/main/java/io/avaje/inject/spi/DContextEntry.java +++ b/inject/src/main/java/io/avaje/inject/spi/DContextEntry.java @@ -123,12 +123,20 @@ private Object match(List entries) { private DContextEntryBean findMatch(List entries) { for (DContextEntryBean entry : entries) { - if (entry.isNameMatch(name)) { + if (entry.isNameEqual(name)) { checkMatch(entry); } } if (match == null && impliedName) { - // search again as if the implied name wasn't there, name = null + // match without implied name, name = null to match against beans with no qualifier + for (DContextEntryBean entry : entries) { + if (entry.isNameEqual(null)) { + checkMatch(entry); + } + } + } + if (match == null && (name == null || impliedName)) { + // match no qualifier injection point to any beans for (DContextEntryBean entry : entries) { checkMatch(entry); }