From e39d980efb8a49b10e6ff58d3cc8d683cc19e0c3 Mon Sep 17 00:00:00 2001 From: Stacey Watro Date: Tue, 17 May 2022 17:19:05 -0400 Subject: [PATCH] Always use the Named key when looking up a Guice object in the GuiceAutowireCandidateResolver. --- .../GuiceAutowireCandidateResolver.java | 11 ++++++---- .../guice/PartialInjectionTests.java | 20 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/guice/module/GuiceAutowireCandidateResolver.java b/src/main/java/org/springframework/guice/module/GuiceAutowireCandidateResolver.java index a46325a..3c0c8c9 100644 --- a/src/main/java/org/springframework/guice/module/GuiceAutowireCandidateResolver.java +++ b/src/main/java/org/springframework/guice/module/GuiceAutowireCandidateResolver.java @@ -112,16 +112,14 @@ class GuiceAutowireCandidateResolver extends ContextAnnotationAutowireCandidateR public Object getTarget() { Object target = null; if (this.isGuiceResolvable.isPresent() && this.isGuiceResolvable.get()) { - target = GuiceAutowireCandidateResolver.this.injectorProvider.get() - .getInstance(Key.get(descriptor.getResolvableType().getType())); + target = targetGuiceObject(); } else { try { target = beanFactory.doResolveDependency(descriptor, beanName, null, null); } catch (NoSuchBeanDefinitionException ex) { - Key key = guiceInstanceResolverKey(); - target = GuiceAutowireCandidateResolver.this.injectorProvider.get().getInstance(key); + target = targetGuiceObject(); this.isGuiceResolvable = Optional.of(true); } } @@ -132,6 +130,11 @@ class GuiceAutowireCandidateResolver extends ContextAnnotationAutowireCandidateR return target; } + private Object targetGuiceObject() { + Key key = guiceInstanceResolverKey(); + return GuiceAutowireCandidateResolver.this.injectorProvider.get().getInstance(key); + } + private Key guiceInstanceResolverKey() { Type type = descriptor.getResolvableType().getType(); diff --git a/src/test/java/org/springframework/guice/PartialInjectionTests.java b/src/test/java/org/springframework/guice/PartialInjectionTests.java index 03937a2..9df64a4 100644 --- a/src/test/java/org/springframework/guice/PartialInjectionTests.java +++ b/src/test/java/org/springframework/guice/PartialInjectionTests.java @@ -71,6 +71,26 @@ public class PartialInjectionTests { assertThat(example.getUnnamedMessage()).isEqualTo("apple"); } + @Test + void shouldResolveNamedComponentOnSecondInjectWhenUsingConstructorInjection() { + Injector injector = guiceInjectorWithSpringBean(ConstructorInjectionExample.class); + + ConstructorInjectionExample example = injector.getInstance(ConstructorInjectionExample.class); + + example.getNamedMessage(); + assertThat(example.getNamedMessage()).isEqualTo("banana"); + } + + @Test + void shouldResolveNamedComponentOnSecondInjectWhenUsingSetterInjection() { + Injector injector = guiceInjectorWithSpringBean(SetterInjectionExample.class); + + SetterInjectionExample example = injector.getInstance(SetterInjectionExample.class); + + example.getNamedMessage(); + assertThat(example.getNamedMessage()).isEqualTo("banana"); + } + private Injector guiceInjectorWithSpringBean(Class classForContext) { Class[] components = new Class[] { classForContext }; BeanFactoryProvider beanFactoryProvider = BeanFactoryProvider.from(components);