Support for fine-grained by-type references and autowired properties

Closes gh-23032
This commit is contained in:
Juergen Hoeller
2019-06-11 18:27:46 +02:00
parent eeb79c8dde
commit 859923b732
7 changed files with 299 additions and 57 deletions

View File

@@ -55,6 +55,7 @@ import org.springframework.beans.PropertyValue;
import org.springframework.beans.TypeConverter;
import org.springframework.beans.TypeMismatchException;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.AutowiredPropertyMarker;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanExpressionContext;
import org.springframework.beans.factory.config.BeanExpressionResolver;
@@ -575,10 +576,94 @@ public class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("self", bd);
TestBean self = (TestBean) lbf.getBean("self");
assertThat(self.getSpouse()).isEqualTo(self);
}
@Test
public void testReferenceByName() {
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("doctor", new RuntimeBeanReference("doc"));
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("self", bd);
lbf.registerBeanDefinition("doc", new RootBeanDefinition(NestedTestBean.class));
TestBean self = (TestBean) lbf.getBean("self");
assertThat(self.getDoctor()).isEqualTo(lbf.getBean("doc"));
}
@Test
public void testReferenceByType() {
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("doctor", new RuntimeBeanReference(NestedTestBean.class));
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("self", bd);
lbf.registerBeanDefinition("doc", new RootBeanDefinition(NestedTestBean.class));
TestBean self = (TestBean) lbf.getBean("self");
assertThat(self.getDoctor()).isEqualTo(lbf.getBean("doc"));
}
@Test
public void testReferenceByAutowire() {
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("doctor", AutowiredPropertyMarker.INSTANCE);
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("self", bd);
lbf.registerBeanDefinition("doc", new RootBeanDefinition(NestedTestBean.class));
TestBean self = (TestBean) lbf.getBean("self");
assertThat(self.getDoctor()).isEqualTo(lbf.getBean("doc"));
}
@Test
public void testArrayReferenceByName() {
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("stringArray", new RuntimeBeanReference("string"));
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("self", bd);
lbf.registerSingleton("string", "A");
TestBean self = (TestBean) lbf.getBean("self");
assertThat(self.getStringArray()).hasSize(1);
assertThat(self.getStringArray()).contains("A");
}
@Test
public void testArrayReferenceByType() {
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("stringArray", new RuntimeBeanReference(String.class));
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("self", bd);
lbf.registerSingleton("string", "A");
TestBean self = (TestBean) lbf.getBean("self");
assertThat(self.getStringArray()).hasSize(1);
assertThat(self.getStringArray()).contains("A");
}
@Test
public void testArrayReferenceByAutowire() {
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("stringArray", AutowiredPropertyMarker.INSTANCE);
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("self", bd);
lbf.registerSingleton("string1", "A");
lbf.registerSingleton("string2", "B");
TestBean self = (TestBean) lbf.getBean("self");
assertThat(self.getStringArray()).hasSize(2);
assertThat(self.getStringArray()).contains("A");
assertThat(self.getStringArray()).contains("B");
}
@Test
public void testPossibleMatches() {
MutablePropertyValues pvs = new MutablePropertyValues();
@@ -586,6 +671,7 @@ public class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("tb", bd);
assertThatExceptionOfType(BeanCreationException.class).as("invalid property").isThrownBy(() ->
lbf.getBean("tb"))
.withCauseInstanceOf(NotWritablePropertyException.class)