RootBeanDefinition accepts ResolvableType for target type hint
Issue: SPR-14580
This commit is contained in:
@@ -41,6 +41,7 @@ import org.mockito.Mockito;
|
||||
|
||||
import org.springframework.beans.factory.BeanCreationException;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.BeanNameAware;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
|
||||
@@ -2047,6 +2048,24 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||
assertSame(bean2, bean1.gi2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenericsBasedInjectionWithBeanDefinitionTargetResolvableType() throws Exception {
|
||||
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
||||
bf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
|
||||
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
|
||||
bpp.setBeanFactory(bf);
|
||||
bf.addBeanPostProcessor(bpp);
|
||||
RootBeanDefinition bd1 = new RootBeanDefinition(GenericInterface2Bean.class);
|
||||
bd1.setTargetType(ResolvableType.forClassWithGenerics(GenericInterface2Bean.class, String.class));
|
||||
bf.registerBeanDefinition("bean1", bd1);
|
||||
RootBeanDefinition bd2 = new RootBeanDefinition(GenericInterface2Bean.class);
|
||||
bd2.setTargetType(ResolvableType.forClassWithGenerics(GenericInterface2Bean.class, Integer.class));
|
||||
bf.registerBeanDefinition("bean2", bd2);
|
||||
bf.registerBeanDefinition("bean3", new RootBeanDefinition(MultiGenericFieldInjection.class));
|
||||
|
||||
assertEquals("bean1 a bean2 123", bf.getBean("bean3").toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCircularTypeReference() {
|
||||
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
||||
@@ -3139,6 +3158,37 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||
}
|
||||
|
||||
|
||||
public static class GenericInterface2Bean<K> implements GenericInterface2<K>, BeanNameAware {
|
||||
|
||||
private String name;
|
||||
|
||||
@Override
|
||||
public void setBeanName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String doSomethingMoreGeneric(K o) {
|
||||
return this.name + " " + o;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class MultiGenericFieldInjection {
|
||||
|
||||
@Autowired
|
||||
private GenericInterface2<String> stringBean;
|
||||
|
||||
@Autowired
|
||||
private GenericInterface2<Integer> integerBean;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.stringBean.doSomethingMoreGeneric("a") + " " + this.integerBean.doSomethingMoreGeneric(123);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static class PlainGenericInterface2Impl implements GenericInterface2 {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user