|
|
|
|
@@ -16,14 +16,6 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.beans.factory.annotation;
|
|
|
|
|
|
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
|
|
|
import static org.junit.Assert.assertNotNull;
|
|
|
|
|
import static org.junit.Assert.assertNotSame;
|
|
|
|
|
import static org.junit.Assert.assertNull;
|
|
|
|
|
import static org.junit.Assert.assertSame;
|
|
|
|
|
import static org.junit.Assert.assertTrue;
|
|
|
|
|
import static org.junit.Assert.fail;
|
|
|
|
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
|
|
import java.lang.annotation.ElementType;
|
|
|
|
|
import java.lang.annotation.Retention;
|
|
|
|
|
@@ -33,6 +25,7 @@ import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
import org.junit.Test;
|
|
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.BeanCreationException;
|
|
|
|
|
import org.springframework.beans.factory.BeanFactory;
|
|
|
|
|
import org.springframework.beans.factory.FactoryBean;
|
|
|
|
|
@@ -43,12 +36,16 @@ import org.springframework.beans.factory.support.AutowireCandidateQualifier;
|
|
|
|
|
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
|
|
|
|
import org.springframework.beans.factory.support.GenericBeanDefinition;
|
|
|
|
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
|
|
|
|
import org.springframework.core.Ordered;
|
|
|
|
|
import org.springframework.core.annotation.Order;
|
|
|
|
|
import org.springframework.tests.sample.beans.ITestBean;
|
|
|
|
|
import org.springframework.tests.sample.beans.IndexedTestBean;
|
|
|
|
|
import org.springframework.tests.sample.beans.NestedTestBean;
|
|
|
|
|
import org.springframework.tests.sample.beans.TestBean;
|
|
|
|
|
import org.springframework.util.SerializationTestUtils;
|
|
|
|
|
|
|
|
|
|
import static org.junit.Assert.*;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Unit tests for {@link AutowiredAnnotationBeanPostProcessor}.
|
|
|
|
|
@@ -348,6 +345,148 @@ public final class AutowiredAnnotationBeanPostProcessorTests {
|
|
|
|
|
bf.destroySingletons();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testOrderedResourceInjection() {
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
|
|
|
|
|
bpp.setBeanFactory(bf);
|
|
|
|
|
bf.addBeanPostProcessor(bpp);
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(OptionalResourceInjectionBean.class));
|
|
|
|
|
TestBean tb = new TestBean();
|
|
|
|
|
bf.registerSingleton("testBean", tb);
|
|
|
|
|
IndexedTestBean itb = new IndexedTestBean();
|
|
|
|
|
bf.registerSingleton("indexedTestBean", itb);
|
|
|
|
|
OrderedNestedTestBean ntb1 = new OrderedNestedTestBean();
|
|
|
|
|
ntb1.setOrder(2);
|
|
|
|
|
bf.registerSingleton("nestedTestBean1", ntb1);
|
|
|
|
|
OrderedNestedTestBean ntb2 = new OrderedNestedTestBean();
|
|
|
|
|
ntb2.setOrder(1);
|
|
|
|
|
bf.registerSingleton("nestedTestBean2", ntb2);
|
|
|
|
|
|
|
|
|
|
OptionalResourceInjectionBean bean = (OptionalResourceInjectionBean) bf.getBean("annotatedBean");
|
|
|
|
|
assertSame(tb, bean.getTestBean());
|
|
|
|
|
assertSame(tb, bean.getTestBean2());
|
|
|
|
|
assertSame(tb, bean.getTestBean3());
|
|
|
|
|
assertSame(tb, bean.getTestBean4());
|
|
|
|
|
assertSame(itb, bean.getIndexedTestBean());
|
|
|
|
|
assertEquals(2, bean.getNestedTestBeans().length);
|
|
|
|
|
assertSame(ntb2, bean.getNestedTestBeans()[0]);
|
|
|
|
|
assertSame(ntb1, bean.getNestedTestBeans()[1]);
|
|
|
|
|
assertEquals(2, bean.nestedTestBeansField.length);
|
|
|
|
|
assertSame(ntb2, bean.nestedTestBeansField[0]);
|
|
|
|
|
assertSame(ntb1, bean.nestedTestBeansField[1]);
|
|
|
|
|
bf.destroySingletons();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testAnnotationOrderedResourceInjection() {
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
|
|
|
|
|
bpp.setBeanFactory(bf);
|
|
|
|
|
bf.addBeanPostProcessor(bpp);
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(OptionalResourceInjectionBean.class));
|
|
|
|
|
TestBean tb = new TestBean();
|
|
|
|
|
bf.registerSingleton("testBean", tb);
|
|
|
|
|
IndexedTestBean itb = new IndexedTestBean();
|
|
|
|
|
bf.registerSingleton("indexedTestBean", itb);
|
|
|
|
|
FixedOrder2NestedTestBean ntb1 = new FixedOrder2NestedTestBean();
|
|
|
|
|
bf.registerSingleton("nestedTestBean1", ntb1);
|
|
|
|
|
FixedOrder1NestedTestBean ntb2 = new FixedOrder1NestedTestBean();
|
|
|
|
|
bf.registerSingleton("nestedTestBean2", ntb2);
|
|
|
|
|
|
|
|
|
|
OptionalResourceInjectionBean bean = (OptionalResourceInjectionBean) bf.getBean("annotatedBean");
|
|
|
|
|
assertSame(tb, bean.getTestBean());
|
|
|
|
|
assertSame(tb, bean.getTestBean2());
|
|
|
|
|
assertSame(tb, bean.getTestBean3());
|
|
|
|
|
assertSame(tb, bean.getTestBean4());
|
|
|
|
|
assertSame(itb, bean.getIndexedTestBean());
|
|
|
|
|
assertEquals(2, bean.getNestedTestBeans().length);
|
|
|
|
|
assertSame(ntb2, bean.getNestedTestBeans()[0]);
|
|
|
|
|
assertSame(ntb1, bean.getNestedTestBeans()[1]);
|
|
|
|
|
assertEquals(2, bean.nestedTestBeansField.length);
|
|
|
|
|
assertSame(ntb2, bean.nestedTestBeansField[0]);
|
|
|
|
|
assertSame(ntb1, bean.nestedTestBeansField[1]);
|
|
|
|
|
bf.destroySingletons();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testOrderedCollectionResourceInjection() {
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
|
|
|
|
|
bpp.setBeanFactory(bf);
|
|
|
|
|
bf.addBeanPostProcessor(bpp);
|
|
|
|
|
RootBeanDefinition rbd = new RootBeanDefinition(OptionalCollectionResourceInjectionBean.class);
|
|
|
|
|
rbd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", rbd);
|
|
|
|
|
TestBean tb = new TestBean();
|
|
|
|
|
bf.registerSingleton("testBean", tb);
|
|
|
|
|
IndexedTestBean itb = new IndexedTestBean();
|
|
|
|
|
bf.registerSingleton("indexedTestBean", itb);
|
|
|
|
|
OrderedNestedTestBean ntb1 = new OrderedNestedTestBean();
|
|
|
|
|
ntb1.setOrder(2);
|
|
|
|
|
bf.registerSingleton("nestedTestBean1", ntb1);
|
|
|
|
|
OrderedNestedTestBean ntb2 = new OrderedNestedTestBean();
|
|
|
|
|
ntb2.setOrder(1);
|
|
|
|
|
bf.registerSingleton("nestedTestBean2", ntb2);
|
|
|
|
|
|
|
|
|
|
// Two calls to verify that caching doesn't break re-creation.
|
|
|
|
|
OptionalCollectionResourceInjectionBean bean = (OptionalCollectionResourceInjectionBean) bf.getBean("annotatedBean");
|
|
|
|
|
bean = (OptionalCollectionResourceInjectionBean) bf.getBean("annotatedBean");
|
|
|
|
|
assertSame(tb, bean.getTestBean());
|
|
|
|
|
assertSame(tb, bean.getTestBean2());
|
|
|
|
|
assertSame(tb, bean.getTestBean3());
|
|
|
|
|
assertSame(tb, bean.getTestBean4());
|
|
|
|
|
assertSame(itb, bean.getIndexedTestBean());
|
|
|
|
|
assertEquals(2, bean.getNestedTestBeans().size());
|
|
|
|
|
assertSame(ntb2, bean.getNestedTestBeans().get(0));
|
|
|
|
|
assertSame(ntb1, bean.getNestedTestBeans().get(1));
|
|
|
|
|
assertEquals(2, bean.nestedTestBeansSetter.size());
|
|
|
|
|
assertSame(ntb2, bean.nestedTestBeansSetter.get(0));
|
|
|
|
|
assertSame(ntb1, bean.nestedTestBeansSetter.get(1));
|
|
|
|
|
assertEquals(2, bean.nestedTestBeansField.size());
|
|
|
|
|
assertSame(ntb2, bean.nestedTestBeansField.get(0));
|
|
|
|
|
assertSame(ntb1, bean.nestedTestBeansField.get(1));
|
|
|
|
|
bf.destroySingletons();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testAnnotationOrderedCollectionResourceInjection() {
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
|
|
|
|
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
|
|
|
|
|
bpp.setBeanFactory(bf);
|
|
|
|
|
bf.addBeanPostProcessor(bpp);
|
|
|
|
|
RootBeanDefinition rbd = new RootBeanDefinition(OptionalCollectionResourceInjectionBean.class);
|
|
|
|
|
rbd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
|
|
|
|
|
bf.registerBeanDefinition("annotatedBean", rbd);
|
|
|
|
|
TestBean tb = new TestBean();
|
|
|
|
|
bf.registerSingleton("testBean", tb);
|
|
|
|
|
IndexedTestBean itb = new IndexedTestBean();
|
|
|
|
|
bf.registerSingleton("indexedTestBean", itb);
|
|
|
|
|
FixedOrder2NestedTestBean ntb1 = new FixedOrder2NestedTestBean();
|
|
|
|
|
bf.registerSingleton("nestedTestBean1", ntb1);
|
|
|
|
|
FixedOrder1NestedTestBean ntb2 = new FixedOrder1NestedTestBean();
|
|
|
|
|
bf.registerSingleton("nestedTestBean2", ntb2);
|
|
|
|
|
|
|
|
|
|
// Two calls to verify that caching doesn't break re-creation.
|
|
|
|
|
OptionalCollectionResourceInjectionBean bean = (OptionalCollectionResourceInjectionBean) bf.getBean("annotatedBean");
|
|
|
|
|
bean = (OptionalCollectionResourceInjectionBean) bf.getBean("annotatedBean");
|
|
|
|
|
assertSame(tb, bean.getTestBean());
|
|
|
|
|
assertSame(tb, bean.getTestBean2());
|
|
|
|
|
assertSame(tb, bean.getTestBean3());
|
|
|
|
|
assertSame(tb, bean.getTestBean4());
|
|
|
|
|
assertSame(itb, bean.getIndexedTestBean());
|
|
|
|
|
assertEquals(2, bean.getNestedTestBeans().size());
|
|
|
|
|
assertSame(ntb2, bean.getNestedTestBeans().get(0));
|
|
|
|
|
assertSame(ntb1, bean.getNestedTestBeans().get(1));
|
|
|
|
|
assertEquals(2, bean.nestedTestBeansSetter.size());
|
|
|
|
|
assertSame(ntb2, bean.nestedTestBeansSetter.get(0));
|
|
|
|
|
assertSame(ntb1, bean.nestedTestBeansSetter.get(1));
|
|
|
|
|
assertEquals(2, bean.nestedTestBeansField.size());
|
|
|
|
|
assertSame(ntb2, bean.nestedTestBeansField.get(0));
|
|
|
|
|
assertSame(ntb1, bean.nestedTestBeansField.get(1));
|
|
|
|
|
bf.destroySingletons();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testConstructorResourceInjection() {
|
|
|
|
|
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
|
|
|
|
|
@@ -1476,4 +1615,28 @@ public final class AutowiredAnnotationBeanPostProcessorTests {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static class OrderedNestedTestBean extends NestedTestBean implements Ordered {
|
|
|
|
|
|
|
|
|
|
private int order;
|
|
|
|
|
|
|
|
|
|
public void setOrder(int order) {
|
|
|
|
|
this.order = order;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getOrder() {
|
|
|
|
|
return this.order;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Order(1)
|
|
|
|
|
public static class FixedOrder1NestedTestBean extends NestedTestBean {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Order(2)
|
|
|
|
|
public static class FixedOrder2NestedTestBean extends NestedTestBean {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|