|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2016 the original author or authors. |
|
|
|
* Copyright 2002-2017 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -929,6 +929,28 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
assertSame(bf.getBean("myTestBeanMap"), bean.getTestBeanMap()); |
|
|
|
assertSame(bf.getBean("myTestBeanMap"), bean.getTestBeanMap()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void testConstructorInjectionWithCustomMapAsBean() { |
|
|
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
|
|
|
|
bf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver()); |
|
|
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
|
|
|
|
|
|
|
bpp.setBeanFactory(bf); |
|
|
|
|
|
|
|
bf.addBeanPostProcessor(bpp); |
|
|
|
|
|
|
|
RootBeanDefinition bd = new RootBeanDefinition(CustomMapConstructorInjectionBean.class); |
|
|
|
|
|
|
|
bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", bd); |
|
|
|
|
|
|
|
RootBeanDefinition tbm = new RootBeanDefinition(CustomCollectionFactoryMethods.class); |
|
|
|
|
|
|
|
tbm.setUniqueFactoryMethodName("testBeanMap"); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("myTestBeanMap", tbm); |
|
|
|
|
|
|
|
bf.registerSingleton("testBean1", new TestBean()); |
|
|
|
|
|
|
|
bf.registerSingleton("testBean2", new TestBean()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CustomMapConstructorInjectionBean bean = (CustomMapConstructorInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
assertSame(bf.getBean("myTestBeanMap"), bean.getTestBeanMap()); |
|
|
|
|
|
|
|
bean = (CustomMapConstructorInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
assertSame(bf.getBean("myTestBeanMap"), bean.getTestBeanMap()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void testConstructorInjectionWithTypedSetAsBean() { |
|
|
|
public void testConstructorInjectionWithTypedSetAsBean() { |
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
@ -972,6 +994,26 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
assertSame(bf.getBean("myTestBeanSet"), bean.getTestBeanSet()); |
|
|
|
assertSame(bf.getBean("myTestBeanSet"), bean.getTestBeanSet()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void testConstructorInjectionWithCustomSetAsBean() { |
|
|
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
|
|
|
|
bf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver()); |
|
|
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
|
|
|
|
|
|
|
bpp.setBeanFactory(bf); |
|
|
|
|
|
|
|
bf.addBeanPostProcessor(bpp); |
|
|
|
|
|
|
|
RootBeanDefinition bd = new RootBeanDefinition(CustomSetConstructorInjectionBean.class); |
|
|
|
|
|
|
|
bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", bd); |
|
|
|
|
|
|
|
RootBeanDefinition tbs = new RootBeanDefinition(CustomCollectionFactoryMethods.class); |
|
|
|
|
|
|
|
tbs.setUniqueFactoryMethodName("testBeanSet"); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("myTestBeanSet", tbs); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CustomSetConstructorInjectionBean bean = (CustomSetConstructorInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
assertSame(bf.getBean("myTestBeanSet"), bean.getTestBeanSet()); |
|
|
|
|
|
|
|
bean = (CustomSetConstructorInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
assertSame(bf.getBean("myTestBeanSet"), bean.getTestBeanSet()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void testSelfReference() { |
|
|
|
public void testSelfReference() { |
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
@ -2195,6 +2237,18 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
assertNotNull(bf.getBean("annotatedBean")); |
|
|
|
assertNotNull(bf.getBean("annotatedBean")); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test @Ignore // SPR-15125
|
|
|
|
|
|
|
|
public void testFactoryBeanSelfInjection() { |
|
|
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
|
|
|
|
|
|
|
bpp.setBeanFactory(bf); |
|
|
|
|
|
|
|
bf.addBeanPostProcessor(bpp); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SelfInjectingFactoryBean.class)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SelfInjectingFactoryBean bean = bf.getBean(SelfInjectingFactoryBean.class); |
|
|
|
|
|
|
|
assertSame(bf.getBean("annotatedBean"), bean.testBean); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Qualifier("integerRepo") |
|
|
|
@Qualifier("integerRepo") |
|
|
|
private Repository<?> integerRepositoryQualifierProvider; |
|
|
|
private Repository<?> integerRepositoryQualifierProvider; |
|
|
|
@ -3251,7 +3305,7 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
|
|
|
|
|
|
|
|
public interface GenericInterface2<K> { |
|
|
|
public interface GenericInterface2<K> { |
|
|
|
|
|
|
|
|
|
|
|
public String doSomethingMoreGeneric(K o); |
|
|
|
String doSomethingMoreGeneric(K o); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -3437,6 +3491,70 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class CustomCollectionFactoryMethods { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static CustomMap<String, TestBean> testBeanMap() { |
|
|
|
|
|
|
|
CustomMap<String, TestBean> tbm = new CustomHashMap<>(); |
|
|
|
|
|
|
|
tbm.put("testBean1", new TestBean("tb1")); |
|
|
|
|
|
|
|
tbm.put("testBean2", new TestBean("tb2")); |
|
|
|
|
|
|
|
return tbm; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static CustomSet<TestBean> testBeanSet() { |
|
|
|
|
|
|
|
CustomSet<TestBean> tbs = new CustomHashSet<>(); |
|
|
|
|
|
|
|
tbs.add(new TestBean("tb1")); |
|
|
|
|
|
|
|
tbs.add(new TestBean("tb2")); |
|
|
|
|
|
|
|
return tbs; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class CustomMapConstructorInjectionBean { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private CustomMap<String, TestBean> testBeanMap; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
|
|
public CustomMapConstructorInjectionBean(CustomMap<String, TestBean> testBeanMap) { |
|
|
|
|
|
|
|
this.testBeanMap = testBeanMap; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public CustomMap<String, TestBean> getTestBeanMap() { |
|
|
|
|
|
|
|
return this.testBeanMap; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class CustomSetConstructorInjectionBean { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private CustomSet<TestBean> testBeanSet; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
|
|
public CustomSetConstructorInjectionBean(CustomSet<TestBean> testBeanSet) { |
|
|
|
|
|
|
|
this.testBeanSet = testBeanSet; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public CustomSet<TestBean> getTestBeanSet() { |
|
|
|
|
|
|
|
return this.testBeanSet; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public interface CustomMap<K, V> extends Map<K, V> { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class CustomHashMap<K, V> extends LinkedHashMap<K, V> implements CustomMap<K, V> { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public interface CustomSet<E> extends Set<E> { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class CustomHashSet<E> extends LinkedHashSet<E> implements CustomSet<E> { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class AnnotatedDefaultConstructorBean { |
|
|
|
public static class AnnotatedDefaultConstructorBean { |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
@ -3444,4 +3562,28 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class SelfInjectingFactoryBean implements FactoryBean<TestBean> { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final TestBean exposedTestBean = new TestBean(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
|
|
TestBean testBean; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public TestBean getObject() { |
|
|
|
|
|
|
|
return exposedTestBean; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public Class<?> getObjectType() { |
|
|
|
|
|
|
|
return TestBean.class; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean isSingleton() { |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|