diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java b/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java index 4855fc3a6..d7a4a3cad 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java @@ -235,6 +235,8 @@ void builderBuildAddBean(Append writer) { writer.append(".asPrimary()"); } else if (secondary) { writer.append(".asSecondary()"); + } else if (prototype) { + writer.append(".asPrototype()"); } if (Util.isProvider(returnTypeRaw)) { writer.append(".registerProvider(bean);").eol(); @@ -360,7 +362,7 @@ void commentBuildMethod(Append writer) { } boolean isProtoType() { - return prototype; + return prototype && !Util.isProvider(returnTypeRaw); } boolean isLazy() { diff --git a/inject-test/src/test/java/org/example/coffee/provider/FactoryProvider.java b/inject-test/src/test/java/org/example/coffee/provider/FactoryProvider.java index 176d6da16..5253c358e 100644 --- a/inject-test/src/test/java/org/example/coffee/provider/FactoryProvider.java +++ b/inject-test/src/test/java/org/example/coffee/provider/FactoryProvider.java @@ -1,9 +1,11 @@ package org.example.coffee.provider; +import java.util.Random; import java.util.function.Supplier; import io.avaje.inject.Bean; import io.avaje.inject.Factory; +import io.avaje.inject.Prototype; import io.avaje.inject.Secondary; import jakarta.inject.Named; import jakarta.inject.Provider; @@ -22,4 +24,10 @@ Provider second() { Provider> supply() { return () -> () -> "Stand proud Provider, you were strong"; } + + @Bean + @Prototype + Provider random() { + return new Random()::nextLong; + } } diff --git a/inject-test/src/test/java/org/example/coffee/provider/FactoryProviderTest.java b/inject-test/src/test/java/org/example/coffee/provider/FactoryProviderTest.java index b1868a142..5b2e6e74e 100644 --- a/inject-test/src/test/java/org/example/coffee/provider/FactoryProviderTest.java +++ b/inject-test/src/test/java/org/example/coffee/provider/FactoryProviderTest.java @@ -19,4 +19,12 @@ void test() { assertThat(scope.get(String.class, "second")).isEqualTo("Nah, I'd win"); } } + + @Test + void testProtoType() { + try (var scope = BeanScope.builder().build()) { + var numberGetter = scope.get(ProtoTypeNumberGetter.class); + assertThat(numberGetter.number()).isNotEqualTo(numberGetter.number()); + } + } } diff --git a/inject-test/src/test/java/org/example/coffee/provider/ProtoTypeNumberGetter.java b/inject-test/src/test/java/org/example/coffee/provider/ProtoTypeNumberGetter.java new file mode 100644 index 000000000..358d7d7a6 --- /dev/null +++ b/inject-test/src/test/java/org/example/coffee/provider/ProtoTypeNumberGetter.java @@ -0,0 +1,18 @@ +package org.example.coffee.provider; + +import jakarta.inject.Provider; +import jakarta.inject.Singleton; + +@Singleton +class ProtoTypeNumberGetter { + + private final Provider nProv; + + ProtoTypeNumberGetter(Provider nProv) { + this.nProv = nProv; + } + + Long number() { + return nProv.get(); + } +}