|
|
|
@ -41,7 +41,10 @@ import org.mockito.Mockito; |
|
|
|
import org.springframework.beans.factory.BeanCreationException; |
|
|
|
import org.springframework.beans.factory.BeanCreationException; |
|
|
|
import org.springframework.beans.factory.BeanFactory; |
|
|
|
import org.springframework.beans.factory.BeanFactory; |
|
|
|
import org.springframework.beans.factory.FactoryBean; |
|
|
|
import org.springframework.beans.factory.FactoryBean; |
|
|
|
|
|
|
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException; |
|
|
|
|
|
|
|
import org.springframework.beans.factory.NoUniqueBeanDefinitionException; |
|
|
|
import org.springframework.beans.factory.ObjectFactory; |
|
|
|
import org.springframework.beans.factory.ObjectFactory; |
|
|
|
|
|
|
|
import org.springframework.beans.factory.SmartObjectFactory; |
|
|
|
import org.springframework.beans.factory.UnsatisfiedDependencyException; |
|
|
|
import org.springframework.beans.factory.UnsatisfiedDependencyException; |
|
|
|
import org.springframework.beans.factory.config.BeanDefinition; |
|
|
|
import org.springframework.beans.factory.config.BeanDefinition; |
|
|
|
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
|
|
|
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
|
|
|
@ -1044,6 +1047,91 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
bf.destroySingletons(); |
|
|
|
bf.destroySingletons(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void testSmartObjectFactoryInjection() { |
|
|
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
|
|
|
|
|
|
|
bpp.setBeanFactory(bf); |
|
|
|
|
|
|
|
bf.addBeanPostProcessor(bpp); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
assertSame(bf.getBean("testBean"), bean.getTestBean()); |
|
|
|
|
|
|
|
assertSame(bf.getBean("testBean"), bean.getOptionalTestBean()); |
|
|
|
|
|
|
|
assertSame(bf.getBean("testBean"), bean.getUniqueTestBean()); |
|
|
|
|
|
|
|
bf.destroySingletons(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void testSmartObjectFactoryInjectionWithTargetNotAvailable() { |
|
|
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
|
|
|
|
|
|
|
bpp.setBeanFactory(bf); |
|
|
|
|
|
|
|
bf.addBeanPostProcessor(bpp); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
bean.getTestBean(); |
|
|
|
|
|
|
|
fail("Should have thrown NoSuchBeanDefinitionException"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (NoSuchBeanDefinitionException ex) { |
|
|
|
|
|
|
|
// expected
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
assertNull(bean.getOptionalTestBean()); |
|
|
|
|
|
|
|
assertNull(bean.getUniqueTestBean()); |
|
|
|
|
|
|
|
bf.destroySingletons(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void testSmartObjectFactoryInjectionWithTargetNotUnique() { |
|
|
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
|
|
|
|
|
|
|
bpp.setBeanFactory(bf); |
|
|
|
|
|
|
|
bf.addBeanPostProcessor(bpp); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("testBean1", new RootBeanDefinition(TestBean.class)); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("testBean2", new RootBeanDefinition(TestBean.class)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
bean.getTestBean(); |
|
|
|
|
|
|
|
fail("Should have thrown NoUniqueBeanDefinitionException"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (NoUniqueBeanDefinitionException ex) { |
|
|
|
|
|
|
|
// expected
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
bean.getOptionalTestBean(); |
|
|
|
|
|
|
|
fail("Should have thrown NoUniqueBeanDefinitionException"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (NoUniqueBeanDefinitionException ex) { |
|
|
|
|
|
|
|
// expected
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
assertNull(bean.getUniqueTestBean()); |
|
|
|
|
|
|
|
bf.destroySingletons(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void testSmartObjectFactoryInjectionWithTargetPrimary() { |
|
|
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
|
|
|
|
|
|
|
bpp.setBeanFactory(bf); |
|
|
|
|
|
|
|
bf.addBeanPostProcessor(bpp); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
|
|
|
|
|
|
|
RootBeanDefinition tb1 = new RootBeanDefinition(TestBean.class); |
|
|
|
|
|
|
|
tb1.setPrimary(true); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("testBean1", tb1); |
|
|
|
|
|
|
|
bf.registerBeanDefinition("testBean2", new RootBeanDefinition(TestBean.class)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
|
|
|
|
|
|
|
assertSame(bf.getBean("testBean1"), bean.getTestBean()); |
|
|
|
|
|
|
|
assertSame(bf.getBean("testBean1"), bean.getOptionalTestBean()); |
|
|
|
|
|
|
|
assertSame(bf.getBean("testBean1"), bean.getUniqueTestBean()); |
|
|
|
|
|
|
|
bf.destroySingletons(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void testCustomAnnotationRequiredFieldResourceInjection() { |
|
|
|
public void testCustomAnnotationRequiredFieldResourceInjection() { |
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
|
|
|
@ -2461,6 +2549,25 @@ public class AutowiredAnnotationBeanPostProcessorTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class SmartObjectFactoryInjectionBean { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
|
|
private SmartObjectFactory<TestBean> testBeanFactory; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TestBean getTestBean() { |
|
|
|
|
|
|
|
return this.testBeanFactory.getObject(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TestBean getOptionalTestBean() { |
|
|
|
|
|
|
|
return this.testBeanFactory.getIfAvailable(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TestBean getUniqueTestBean() { |
|
|
|
|
|
|
|
return this.testBeanFactory.getIfUnique(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class CustomAnnotationRequiredFieldResourceInjectionBean { |
|
|
|
public static class CustomAnnotationRequiredFieldResourceInjectionBean { |
|
|
|
|
|
|
|
|
|
|
|
@MyAutowired(optional = false) |
|
|
|
@MyAutowired(optional = false) |
|
|
|
|