|
41 | 41 | import org.springframework.beans.factory.BeanCreationException;
|
42 | 42 | import org.springframework.beans.factory.BeanFactory;
|
43 | 43 | import org.springframework.beans.factory.FactoryBean;
|
| 44 | +import org.springframework.beans.factory.NoSuchBeanDefinitionException; |
| 45 | +import org.springframework.beans.factory.NoUniqueBeanDefinitionException; |
44 | 46 | import org.springframework.beans.factory.ObjectFactory;
|
| 47 | +import org.springframework.beans.factory.SmartObjectFactory; |
45 | 48 | import org.springframework.beans.factory.UnsatisfiedDependencyException;
|
46 | 49 | import org.springframework.beans.factory.config.BeanDefinition;
|
47 | 50 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
@@ -1044,6 +1047,91 @@ public void testObjectFactorySerialization() throws Exception {
|
1044 | 1047 | bf.destroySingletons();
|
1045 | 1048 | }
|
1046 | 1049 |
|
| 1050 | + @Test |
| 1051 | + public void testSmartObjectFactoryInjection() { |
| 1052 | + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
| 1053 | + AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
| 1054 | + bpp.setBeanFactory(bf); |
| 1055 | + bf.addBeanPostProcessor(bpp); |
| 1056 | + bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
| 1057 | + bf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class)); |
| 1058 | + |
| 1059 | + SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
| 1060 | + assertSame(bf.getBean("testBean"), bean.getTestBean()); |
| 1061 | + assertSame(bf.getBean("testBean"), bean.getOptionalTestBean()); |
| 1062 | + assertSame(bf.getBean("testBean"), bean.getUniqueTestBean()); |
| 1063 | + bf.destroySingletons(); |
| 1064 | + } |
| 1065 | + |
| 1066 | + @Test |
| 1067 | + public void testSmartObjectFactoryInjectionWithTargetNotAvailable() { |
| 1068 | + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
| 1069 | + AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
| 1070 | + bpp.setBeanFactory(bf); |
| 1071 | + bf.addBeanPostProcessor(bpp); |
| 1072 | + bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
| 1073 | + |
| 1074 | + SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
| 1075 | + try { |
| 1076 | + bean.getTestBean(); |
| 1077 | + fail("Should have thrown NoSuchBeanDefinitionException"); |
| 1078 | + } |
| 1079 | + catch (NoSuchBeanDefinitionException ex) { |
| 1080 | + // expected |
| 1081 | + } |
| 1082 | + assertNull(bean.getOptionalTestBean()); |
| 1083 | + assertNull(bean.getUniqueTestBean()); |
| 1084 | + bf.destroySingletons(); |
| 1085 | + } |
| 1086 | + |
| 1087 | + @Test |
| 1088 | + public void testSmartObjectFactoryInjectionWithTargetNotUnique() { |
| 1089 | + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
| 1090 | + AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
| 1091 | + bpp.setBeanFactory(bf); |
| 1092 | + bf.addBeanPostProcessor(bpp); |
| 1093 | + bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
| 1094 | + bf.registerBeanDefinition("testBean1", new RootBeanDefinition(TestBean.class)); |
| 1095 | + bf.registerBeanDefinition("testBean2", new RootBeanDefinition(TestBean.class)); |
| 1096 | + |
| 1097 | + SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
| 1098 | + try { |
| 1099 | + bean.getTestBean(); |
| 1100 | + fail("Should have thrown NoUniqueBeanDefinitionException"); |
| 1101 | + } |
| 1102 | + catch (NoUniqueBeanDefinitionException ex) { |
| 1103 | + // expected |
| 1104 | + } |
| 1105 | + try { |
| 1106 | + bean.getOptionalTestBean(); |
| 1107 | + fail("Should have thrown NoUniqueBeanDefinitionException"); |
| 1108 | + } |
| 1109 | + catch (NoUniqueBeanDefinitionException ex) { |
| 1110 | + // expected |
| 1111 | + } |
| 1112 | + assertNull(bean.getUniqueTestBean()); |
| 1113 | + bf.destroySingletons(); |
| 1114 | + } |
| 1115 | + |
| 1116 | + @Test |
| 1117 | + public void testSmartObjectFactoryInjectionWithTargetPrimary() { |
| 1118 | + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); |
| 1119 | + AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); |
| 1120 | + bpp.setBeanFactory(bf); |
| 1121 | + bf.addBeanPostProcessor(bpp); |
| 1122 | + bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(SmartObjectFactoryInjectionBean.class)); |
| 1123 | + RootBeanDefinition tb1 = new RootBeanDefinition(TestBean.class); |
| 1124 | + tb1.setPrimary(true); |
| 1125 | + bf.registerBeanDefinition("testBean1", tb1); |
| 1126 | + bf.registerBeanDefinition("testBean2", new RootBeanDefinition(TestBean.class)); |
| 1127 | + |
| 1128 | + SmartObjectFactoryInjectionBean bean = (SmartObjectFactoryInjectionBean) bf.getBean("annotatedBean"); |
| 1129 | + assertSame(bf.getBean("testBean1"), bean.getTestBean()); |
| 1130 | + assertSame(bf.getBean("testBean1"), bean.getOptionalTestBean()); |
| 1131 | + assertSame(bf.getBean("testBean1"), bean.getUniqueTestBean()); |
| 1132 | + bf.destroySingletons(); |
| 1133 | + } |
| 1134 | + |
1047 | 1135 | @Test
|
1048 | 1136 | public void testCustomAnnotationRequiredFieldResourceInjection() {
|
1049 | 1137 | DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
@@ -2461,6 +2549,25 @@ public TestBean getTestBean() {
|
2461 | 2549 | }
|
2462 | 2550 |
|
2463 | 2551 |
|
| 2552 | + public static class SmartObjectFactoryInjectionBean { |
| 2553 | + |
| 2554 | + @Autowired |
| 2555 | + private SmartObjectFactory<TestBean> testBeanFactory; |
| 2556 | + |
| 2557 | + public TestBean getTestBean() { |
| 2558 | + return this.testBeanFactory.getObject(); |
| 2559 | + } |
| 2560 | + |
| 2561 | + public TestBean getOptionalTestBean() { |
| 2562 | + return this.testBeanFactory.getIfAvailable(); |
| 2563 | + } |
| 2564 | + |
| 2565 | + public TestBean getUniqueTestBean() { |
| 2566 | + return this.testBeanFactory.getIfUnique(); |
| 2567 | + } |
| 2568 | + } |
| 2569 | + |
| 2570 | + |
2464 | 2571 | public static class CustomAnnotationRequiredFieldResourceInjectionBean {
|
2465 | 2572 |
|
2466 | 2573 | @MyAutowired(optional = false)
|
|
0 commit comments