Avoid unnecessary parameter name inspection for factory method type check

Closes gh-30103
See gh-29612
This commit is contained in:
Juergen Hoeller
2023-03-10 19:19:19 +01:00
parent 99e54fec3a
commit 3431b2330a
2 changed files with 144 additions and 58 deletions

View File

@@ -754,13 +754,15 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
if (candidate.getTypeParameters().length > 0) {
try {
// Fully resolve parameter names and argument values.
ConstructorArgumentValues cav = mbd.getConstructorArgumentValues();
Class<?>[] paramTypes = candidate.getParameterTypes();
String[] paramNames = null;
ParameterNameDiscoverer pnd = getParameterNameDiscoverer();
if (pnd != null) {
paramNames = pnd.getParameterNames(candidate);
if (cav.containsNamedArgument()) {
ParameterNameDiscoverer pnd = getParameterNameDiscoverer();
if (pnd != null) {
paramNames = pnd.getParameterNames(candidate);
}
}
ConstructorArgumentValues cav = mbd.getConstructorArgumentValues();
Set<ConstructorArgumentValues.ValueHolder> usedValueHolders = new HashSet<>(paramTypes.length);
Object[] args = new Object[paramTypes.length];
for (int i = 0; i < args.length; i++) {

View File

@@ -18,7 +18,9 @@ package org.springframework.beans.factory;
import java.io.Closeable;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.text.NumberFormat;
import java.text.ParseException;
@@ -74,7 +76,9 @@ import org.springframework.beans.testfixture.beans.NestedTestBean;
import org.springframework.beans.testfixture.beans.SideEffectBean;
import org.springframework.beans.testfixture.beans.TestBean;
import org.springframework.beans.testfixture.beans.factory.DummyFactory;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.MethodParameter;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.convert.support.DefaultConversionService;
@@ -111,7 +115,21 @@ import static org.mockito.Mockito.verify;
*/
class DefaultListableBeanFactoryTests {
private DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
private final DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
{
// No parameter name discovery expected unless named arguments are used
lbf.setParameterNameDiscoverer(new ParameterNameDiscoverer() {
@Override
public String[] getParameterNames(Method method) {
throw new UnsupportedOperationException();
}
@Override
public String[] getParameterNames(Constructor<?> ctor) {
throw new UnsupportedOperationException();
}
});
}
@Test
@@ -431,7 +449,6 @@ class DefaultListableBeanFactoryTests {
@Test
void empty() {
ListableBeanFactory lbf = new DefaultListableBeanFactory();
assertThat(lbf.getBeanDefinitionNames() != null).as("No beans defined --> array != null").isTrue();
assertThat(lbf.getBeanDefinitionNames().length == 0).as("No beans defined after no arg constructor").isTrue();
assertThat(lbf.getBeanDefinitionCount() == 0).as("No beans defined after no arg constructor").isTrue();
@@ -441,6 +458,7 @@ class DefaultListableBeanFactoryTests {
void emptyPropertiesPopulation() {
Properties p = new Properties();
registerBeanDefinitions(p);
assertThat(lbf.getBeanDefinitionCount() == 0).as("No beans defined after ignorable invalid").isTrue();
}
@@ -450,6 +468,7 @@ class DefaultListableBeanFactoryTests {
p.setProperty("foo", "bar");
p.setProperty("qwert", "er");
registerBeanDefinitions(p, "test");
assertThat(lbf.getBeanDefinitionCount() == 0).as("No beans defined after harmless ignorable rubbish").isTrue();
}
@@ -460,8 +479,9 @@ class DefaultListableBeanFactoryTests {
p.setProperty("test.name", "Tony");
p.setProperty("test.age", "48");
int count = registerBeanDefinitions(p);
assertThat(count == 1).as("1 beans registered, not " + count).isTrue();
singleTestBean(lbf);
testPropertiesPopulation(lbf);
}
@Test
@@ -472,8 +492,22 @@ class DefaultListableBeanFactoryTests {
p.setProperty(PREFIX + "test.name", "Tony");
p.setProperty(PREFIX + "test.age", "0x30");
int count = registerBeanDefinitions(p, PREFIX);
assertThat(count == 1).as("1 beans registered, not " + count).isTrue();
singleTestBean(lbf);
testPropertiesPopulation(lbf);
}
private void testPropertiesPopulation(ListableBeanFactory lbf) {
assertThat(lbf.getBeanDefinitionCount() == 1).as("1 beans defined").isTrue();
String[] names = lbf.getBeanDefinitionNames();
assertThat(names != lbf.getBeanDefinitionNames()).isTrue();
assertThat(names.length == 1).as("Array length == 1").isTrue();
assertThat(names[0].equals("test")).as("0th element == test").isTrue();
TestBean tb = (TestBean) lbf.getBean("test");
assertThat(tb != null).as("Test is non null").isTrue();
assertThat("Tony".equals(tb.getName())).as("Test bean name is Tony").isTrue();
assertThat(tb.getAge() == 48).as("Test bean age is 48").isTrue();
}
@Test
@@ -525,6 +559,7 @@ class DefaultListableBeanFactoryTests {
p.setProperty(PREFIX + "kerry.spouse(ref)", "rod");
registerBeanDefinitions(p, PREFIX);
assertThatExceptionOfType(BeansException.class).as("unresolved reference").isThrownBy(() ->
lbf.getBean("kerry"));
}
@@ -650,7 +685,6 @@ class DefaultListableBeanFactoryTests {
assertThat(kerry1 != null).as("Non null").isTrue();
assertThat(kerry1 == kerry2).as("Singletons equal").isTrue();
lbf = new DefaultListableBeanFactory();
p = new Properties();
p.setProperty("kerry.(class)", TestBean.class.getName());
p.setProperty("kerry.(scope)", BeanDefinition.SCOPE_PROTOTYPE);
@@ -661,7 +695,6 @@ class DefaultListableBeanFactoryTests {
assertThat(kerry1 != null).as("Non null").isTrue();
assertThat(kerry1 != kerry2).as("Prototypes NOT equal").isTrue();
lbf = new DefaultListableBeanFactory();
p = new Properties();
p.setProperty("kerry.(class)", TestBean.class.getName());
p.setProperty("kerry.(scope)", "singleton");
@@ -684,8 +717,8 @@ class DefaultListableBeanFactoryTests {
p.setProperty("rod.(singleton)", "false");
p.setProperty("rod.age", "34");
p.setProperty("rod.spouse", "*kerry");
registerBeanDefinitions(p);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(() ->
lbf.getBean("kerry"))
.satisfies(ex -> assertThat(ex.contains(BeanCurrentlyInCreationException.class)).isTrue());
@@ -706,7 +739,6 @@ class DefaultListableBeanFactoryTests {
assertThat(kerry1).as("Non null").isNotNull();
assertThat(kerry1 == kerry2).as("Singletons equal").isTrue();
lbf = new DefaultListableBeanFactory();
p = new Properties();
p.setProperty("wife.(class)", TestBean.class.getName());
p.setProperty("wife.name", "kerry");
@@ -721,7 +753,6 @@ class DefaultListableBeanFactoryTests {
assertThat(kerry1 != null).as("Non null").isTrue();
assertThat(kerry1 != kerry2).as("Prototypes NOT equal").isTrue();
lbf = new DefaultListableBeanFactory();
p = new Properties();
p.setProperty("kerry.(class)", TestBean.class.getName());
p.setProperty("kerry.(singleton)", "true");
@@ -796,41 +827,17 @@ class DefaultListableBeanFactoryTests {
assertThat(factory.getBean("child")).isInstanceOf(DerivedTestBean.class);
}
@Test
void nameAlreadyBound() {
Properties p = new Properties();
p.setProperty("kerry.(class)", TestBean.class.getName());
p.setProperty("kerry.age", "35");
registerBeanDefinitions(p);
try {
registerBeanDefinitions(p);
}
catch (BeanDefinitionStoreException ex) {
assertThat(ex.getBeanName()).isEqualTo("kerry");
// expected
}
}
private void singleTestBean(ListableBeanFactory lbf) {
assertThat(lbf.getBeanDefinitionCount() == 1).as("1 beans defined").isTrue();
String[] names = lbf.getBeanDefinitionNames();
assertThat(names != lbf.getBeanDefinitionNames()).isTrue();
assertThat(names.length == 1).as("Array length == 1").isTrue();
assertThat(names[0].equals("test")).as("0th element == test").isTrue();
TestBean tb = (TestBean) lbf.getBean("test");
assertThat(tb != null).as("Test is non null").isTrue();
assertThat("Tony".equals(tb.getName())).as("Test bean name is Tony").isTrue();
assertThat(tb.getAge() == 48).as("Test bean age is 48").isTrue();
}
@Test
void aliasCircle() {
lbf.registerAlias("test", "test2");
lbf.registerAlias("test2", "test3");
assertThatIllegalStateException().isThrownBy(() ->
lbf.registerAlias("test3", "test2"));
assertThatIllegalStateException().isThrownBy(() ->
lbf.registerAlias("test3", "test"));
lbf.registerAlias("test", "test3");
}
@@ -840,6 +847,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerAlias("test", "testAlias");
lbf.registerAlias("testAlias", "testAlias2");
lbf.registerAlias("testAlias2", "testAlias3");
Object bean = lbf.getBean("test");
assertThat(lbf.getBean("testAlias")).isSameAs(bean);
assertThat(lbf.getBean("testAlias2")).isSameAs(bean);
@@ -854,6 +862,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerAlias("test", "test2");
lbf.registerAlias("test", "testX");
lbf.registerBeanDefinition("testX", new RootBeanDefinition(TestBean.class));
assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
assertThat(lbf.getBean("test2")).isInstanceOf(NestedTestBean.class);
assertThat(lbf.getBean("testX")).isInstanceOf(TestBean.class);
@@ -866,13 +875,15 @@ class DefaultListableBeanFactoryTests {
BeanDefinition newDef = new RootBeanDefinition(NestedTestBean.class);
lbf.registerBeanDefinition("test", oldDef);
lbf.registerAlias("test", "testX");
assertThatExceptionOfType(BeanDefinitionOverrideException.class).isThrownBy(() ->
lbf.registerBeanDefinition("test", newDef))
lbf.registerBeanDefinition("test", newDef))
.satisfies(ex -> {
assertThat(ex.getBeanName()).isEqualTo("test");
assertThat(ex.getBeanDefinition()).isEqualTo(newDef);
assertThat(ex.getExistingDefinition()).isEqualTo(oldDef);
});
assertThatExceptionOfType(BeanDefinitionOverrideException.class).isThrownBy(() ->
lbf.registerBeanDefinition("testX", newDef))
.satisfies(ex -> {
@@ -888,6 +899,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerAlias("test", "testAlias");
lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
lbf.registerAlias("test", "testAlias");
assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
assertThat(lbf.getBean("testAlias")).isInstanceOf(NestedTestBean.class);
}
@@ -900,6 +912,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd2 = new RootBeanDefinition(NestedTestBean.class);
bd2.getConstructorArgumentValues().addIndexedArgumentValue(0, "value0");
lbf.registerBeanDefinition("test", bd2);
assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
assertThat(lbf.getBean("test", NestedTestBean.class).getCompany()).isEqualTo("value0");
}
@@ -916,6 +929,7 @@ class DefaultListableBeanFactoryTests {
lbf.removeAlias("test2");
lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
lbf.registerAlias("test", "test2");
assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
assertThat(lbf.getBean("test2")).isInstanceOf(NestedTestBean.class);
}
@@ -955,6 +969,7 @@ class DefaultListableBeanFactoryTests {
p.setProperty("k.name", "kerry");
p.setProperty("k.spouse", "*r");
registerBeanDefinitions(p);
TestBean k = (TestBean) lbf.getBean("k");
TestBean r = (TestBean) lbf.getBean("r");
assertThat(k.getSpouse() == r).isTrue();
@@ -967,6 +982,7 @@ class DefaultListableBeanFactoryTests {
p.setProperty("r.(class)", TestBean.class.getName());
p.setProperty("r.name", "*" + name);
registerBeanDefinitions(p);
TestBean r = (TestBean) lbf.getBean("r");
assertThat(r.getName().equals(name)).isTrue();
}
@@ -982,6 +998,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("testBean", bd);
TestBean testBean = (TestBean) lbf.getBean("testBean");
assertThat(testBean.getMyFloat() == 1.1f).isTrue();
}
@@ -999,11 +1016,13 @@ class DefaultListableBeanFactoryTests {
}
});
lbf.setConversionService(conversionService);
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("myFloat", "1,1");
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("testBean", bd);
TestBean testBean = (TestBean) lbf.getBean("testBean");
assertThat(testBean.getMyFloat() == 1.1f).isTrue();
}
@@ -1020,6 +1039,7 @@ class DefaultListableBeanFactoryTests {
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("testBean", bd);
lbf.registerSingleton("myFloat", "1,1");
TestBean testBean = (TestBean) lbf.getBean("testBean");
assertThat(testBean.getMyFloat() == 1.1f).isTrue();
}
@@ -1034,6 +1054,7 @@ class DefaultListableBeanFactoryTests {
cav.addIndexedArgumentValue(0, "myName");
cav.addIndexedArgumentValue(1, "myAge");
lbf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class, cav, pvs));
TestBean testBean = (TestBean) lbf.getBean("testBean");
assertThat(testBean.getName()).isEqualTo("myName");
assertThat(testBean.getAge()).isEqualTo(5);
@@ -1051,6 +1072,7 @@ class DefaultListableBeanFactoryTests {
cav.addIndexedArgumentValue(1, "myAge");
lbf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class, cav, pvs));
lbf.registerSingleton("myFloat", "1,1");
TestBean testBean = (TestBean) lbf.getBean("testBean");
assertThat(testBean.getName()).isEqualTo("myName");
assertThat(testBean.getAge()).isEqualTo(5);
@@ -1167,6 +1189,7 @@ class DefaultListableBeanFactoryTests {
bd1.setScope(BeanDefinition.SCOPE_PROTOTYPE);
lbf.registerBeanDefinition("testBean", bd1);
assertThat(lbf.getBean("testBean")).isInstanceOf(TestBean.class);
RootBeanDefinition bd2 = new RootBeanDefinition(NestedTestBean.class);
bd2.setScope(BeanDefinition.SCOPE_PROTOTYPE);
lbf.registerBeanDefinition("testBean", bd2);
@@ -1181,8 +1204,8 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition rbd = new RootBeanDefinition(ArrayBean.class);
rbd.setAutowireMode(RootBeanDefinition.AUTOWIRE_BY_TYPE);
lbf.registerBeanDefinition("arrayBean", rbd);
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
assertThat(ab.getResourceArray()[0]).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(ab.getResourceArray()[1]).isEqualTo(new UrlResource("http://localhost:9090"));
}
@@ -1192,8 +1215,8 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition rbd = new RootBeanDefinition(ArrayBean.class);
rbd.setAutowireMode(RootBeanDefinition.AUTOWIRE_BY_TYPE);
lbf.registerBeanDefinition("arrayBean", rbd);
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
assertThat(ab.getResourceArray()).isNull();
}
@@ -1205,8 +1228,8 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition rbd = new RootBeanDefinition(ArrayBean.class);
rbd.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
lbf.registerBeanDefinition("arrayBean", rbd);
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
assertThat(ab.getIntegerArray()[0]).isEqualTo(4);
assertThat(ab.getIntegerArray()[1]).isEqualTo(5);
}
@@ -1216,8 +1239,8 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition rbd = new RootBeanDefinition(ArrayBean.class);
rbd.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
lbf.registerBeanDefinition("arrayBean", rbd);
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
assertThat(ab.getIntegerArray()).isNull();
}
@@ -1231,8 +1254,8 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition rbd = new RootBeanDefinition(ArrayBean.class);
rbd.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
lbf.registerBeanDefinition("arrayBean", rbd);
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
assertThat(ab.getIntegerArray()[0]).isEqualTo(4);
assertThat(ab.getIntegerArray()[1]).isEqualTo(5);
assertThat(ab.getResourceArray()[0]).isEqualTo(new UrlResource("http://localhost:8080"));
@@ -1247,8 +1270,8 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition rbd = new RootBeanDefinition(ArrayBean.class);
rbd.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
lbf.registerBeanDefinition("arrayBean", rbd);
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
ArrayBean ab = (ArrayBean) lbf.getBean("arrayBean");
assertThat(ab.getIntegerArray()).isNull();
assertThat(ab.getResourceArray()).isNull();
}
@@ -1265,6 +1288,7 @@ class DefaultListableBeanFactoryTests {
pvs.add("locations", new String[]{"#{foo}"});
rbd.setPropertyValues(pvs);
lbf.registerBeanDefinition("myProperties", rbd);
Properties properties = (Properties) lbf.getBean("myProperties");
assertThat(properties.getProperty("foo")).isEqualTo("bar");
}
@@ -1287,6 +1311,7 @@ class DefaultListableBeanFactoryTests {
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("rod", bd);
assertThat(lbf.getBeanDefinitionCount()).isEqualTo(1);
// Depends on age, name and spouse (TestBean)
Object registered = lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
assertThat(lbf.getBeanDefinitionCount()).isEqualTo(1);
@@ -1303,6 +1328,7 @@ class DefaultListableBeanFactoryTests {
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("rod", bd);
assertThat(lbf.getBeanDefinitionCount()).isEqualTo(1);
Object registered = lbf.autowire(ConstructorDependency.class, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);
assertThat(lbf.getBeanDefinitionCount()).isEqualTo(1);
ConstructorDependency kerry = (ConstructorDependency) registered;
@@ -1316,6 +1342,8 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("rod", bd);
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("rod2", bd2);
lbf.setParameterNameDiscoverer(new DefaultParameterNameDiscoverer());
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
lbf.autowire(ConstructorDependency.class, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false))
.withMessageContaining("rod")
@@ -1329,6 +1357,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("rod", bd);
assertThat(lbf.getBeanDefinitionCount()).isEqualTo(1);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
lbf.autowire(UnsatisfiedConstructorDependency.class, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, true));
@@ -1340,6 +1369,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("spouse", bd);
ConstructorDependenciesBean bean = (ConstructorDependenciesBean)
lbf.autowire(ConstructorDependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, true);
Object spouse = lbf.getBean("spouse");
assertThat(bean.getSpouse1() == spouse).isTrue();
assertThat(BeanFactoryUtils.beanOfType(lbf, TestBean.class) == spouse).isTrue();
@@ -1351,6 +1381,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("spouse", bd);
DependenciesBean bean = (DependenciesBean)
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true);
TestBean spouse = (TestBean) lbf.getBean("spouse");
assertThat(bean.getSpouse()).isEqualTo(spouse);
assertThat(BeanFactoryUtils.beanOfType(lbf, TestBean.class) == spouse).isTrue();
@@ -1360,6 +1391,7 @@ class DefaultListableBeanFactoryTests {
void autowireBeanByNameWithDependencyCheck() {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("spous", bd);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true));
}
@@ -1370,6 +1402,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("spous", bd);
DependenciesBean bean = (DependenciesBean)
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);
assertThat(bean.getSpouse()).isNull();
}
@@ -1381,6 +1414,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
bd2.setDependsOn("tb1");
lbf.registerBeanDefinition("tb2", bd2);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(() ->
lbf.preInstantiateSingletons())
.withMessageContaining("Circular")
@@ -1399,6 +1433,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd3 = new RootBeanDefinition(TestBean.class);
bd3.setDependsOn("tb1");
lbf.registerBeanDefinition("tb3", bd3);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(
lbf::preInstantiateSingletons)
.withMessageContaining("Circular")
@@ -1408,30 +1443,31 @@ class DefaultListableBeanFactoryTests {
@Test
void getBeanByTypeWithNoneFound() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
assertThatExceptionOfType(NoSuchBeanDefinitionException.class).isThrownBy(() ->
lbf.getBean(TestBean.class));
}
@Test
void getBeanByTypeWithLateRegistration() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
assertThatExceptionOfType(NoSuchBeanDefinitionException.class).isThrownBy(() ->
lbf.getBean(TestBean.class));
RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("bd1", bd1);
TestBean bean = lbf.getBean(TestBean.class);
assertThat(bean.getBeanName()).isEqualTo("bd1");
}
@Test
void getBeanByTypeWithLateRegistrationAgainstFrozen() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.freezeConfiguration();
assertThatExceptionOfType(NoSuchBeanDefinitionException.class).isThrownBy(() ->
lbf.getBean(TestBean.class));
RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("bd1", bd1);
TestBean bean = lbf.getBean(TestBean.class);
assertThat(bean.getBeanName()).isEqualTo("bd1");
}
@@ -1441,7 +1477,8 @@ class DefaultListableBeanFactoryTests {
DefaultListableBeanFactory parent = new DefaultListableBeanFactory();
RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class);
parent.registerBeanDefinition("bd1", bd1);
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(parent);
lbf.setParentBeanFactory(parent);
TestBean bean = lbf.getBean(TestBean.class);
assertThat(bean.getBeanName()).isEqualTo("bd1");
}
@@ -1452,6 +1489,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
assertThatExceptionOfType(NoUniqueBeanDefinitionException.class).isThrownBy(() ->
lbf.getBean(TestBean.class));
}
@@ -1464,6 +1502,7 @@ class DefaultListableBeanFactoryTests {
bd2.setPrimary(true);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
TestBean bean = lbf.getBean(TestBean.class);
assertThat(bean.getBeanName()).isEqualTo("bd2");
assertThat(lbf.containsSingleton("bd1")).isFalse();
@@ -1472,12 +1511,12 @@ class DefaultListableBeanFactoryTests {
@Test
@SuppressWarnings("rawtypes")
void getFactoryBeanByTypeWithPrimary() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition bd1 = new RootBeanDefinition(NullTestBeanFactoryBean.class);
RootBeanDefinition bd2 = new RootBeanDefinition(NullTestBeanFactoryBean.class);
bd2.setPrimary(true);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
NullTestBeanFactoryBean factoryBeanByType = lbf.getBean(NullTestBeanFactoryBean.class);
NullTestBeanFactoryBean bd1FactoryBean = (NullTestBeanFactoryBean)lbf.getBean("&bd1");
NullTestBeanFactoryBean bd2FactoryBean = (NullTestBeanFactoryBean)lbf.getBean("&bd2");
@@ -1496,6 +1535,7 @@ class DefaultListableBeanFactoryTests {
bd2.setPrimary(true);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
assertThatExceptionOfType(NoUniqueBeanDefinitionException.class).isThrownBy(() ->
lbf.getBean(TestBean.class))
.withMessageContaining("more than one 'primary'");
@@ -1511,6 +1551,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("bd2", bd2);
lbf.registerBeanDefinition("bd3", bd3);
lbf.preInstantiateSingletons();
TestBean bean = lbf.getBean(TestBean.class);
assertThat(bean.getBeanName()).isEqualTo("bd1");
}
@@ -1527,6 +1568,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("bd3", bd3);
lbf.registerBeanDefinition("bd4", bd4);
lbf.preInstantiateSingletons();
TestBean bean = lbf.getBean(TestBeanRecipient.class).testBean;
assertThat(bean.getBeanName()).isEqualTo("bd1");
}
@@ -1538,6 +1580,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd2 = new RootBeanDefinition(HighPriorityTestBean.class);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
assertThatExceptionOfType(NoUniqueBeanDefinitionException.class).isThrownBy(() ->
lbf.getBean(TestBean.class))
.withMessageContaining("Multiple beans found with the same priority")
@@ -1551,6 +1594,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd2 = new RootBeanDefinition(NullTestBeanFactoryBean.class);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
TestBean bean = lbf.getBean(TestBean.class);
assertThat(bean.getBeanName()).isEqualTo("bd1");
}
@@ -1563,6 +1607,7 @@ class DefaultListableBeanFactoryTests {
bd2.setPrimary(true);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
TestBean bean = lbf.getBean(TestBean.class);
assertThat(bean.getBeanName()).isEqualTo("bd2");
}
@@ -1620,7 +1665,7 @@ class DefaultListableBeanFactoryTests {
DefaultListableBeanFactory parent = new DefaultListableBeanFactory();
RootBeanDefinition bd1 = createConstructorDependencyBeanDefinition(99);
parent.registerBeanDefinition("bd1", bd1);
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(parent);
lbf.setParentBeanFactory(parent);
ConstructorDependency bean = lbf.getBean(ConstructorDependency.class);
assertThat(bean.beanName).isEqualTo("bd1");
@@ -1652,6 +1697,7 @@ class DefaultListableBeanFactoryTests {
bd2.getConstructorArgumentValues().addGenericArgumentValue("43");
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
assertThatExceptionOfType(NoUniqueBeanDefinitionException.class).isThrownBy(() ->
lbf.getBean(ConstructorDependency.class));
assertThatExceptionOfType(NoUniqueBeanDefinitionException.class).isThrownBy(() ->
@@ -1769,9 +1815,9 @@ class DefaultListableBeanFactoryTests {
@SuppressWarnings("rawtypes")
void beanProviderSerialization() throws Exception {
lbf.setSerializationId("test");
ObjectProvider<ConstructorDependency> provider = lbf.getBeanProvider(ConstructorDependency.class);
ObjectProvider deserialized = SerializationTestUtils.serializeAndDeserialize(provider);
assertThatExceptionOfType(NoSuchBeanDefinitionException.class).isThrownBy(
deserialized::getObject);
assertThatExceptionOfType(NoSuchBeanDefinitionException.class).isThrownBy(() ->
@@ -1814,6 +1860,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("test", bd);
DependenciesBean bean = (DependenciesBean)
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
TestBean test = (TestBean) lbf.getBean("test");
assertThat(bean.getSpouse()).isEqualTo(test);
}
@@ -1828,8 +1875,10 @@ class DefaultListableBeanFactoryTests {
void autowireBeanWithFactoryBeanByType() {
RootBeanDefinition bd = new RootBeanDefinition(LazyInitFactory.class);
lbf.registerBeanDefinition("factoryBean", bd);
LazyInitFactory factoryBean = (LazyInitFactory) lbf.getBean("&factoryBean");
assertThat(factoryBean).as("The FactoryBean should have been registered.").isNotNull();
FactoryBeanDependentBean bean = (FactoryBeanDependentBean) lbf.autowire(FactoryBeanDependentBean.class,
AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
assertThat(bean.getFactoryBean()).as("The FactoryBeanDependentBean should have been autowired 'by type' with the LazyInitFactory.").isEqualTo(factoryBean);
@@ -1837,16 +1886,17 @@ class DefaultListableBeanFactoryTests {
@Test
void autowireBeanWithFactoryBeanByTypeWithPrimary() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition bd1 = new RootBeanDefinition(LazyInitFactory.class);
RootBeanDefinition bd2 = new RootBeanDefinition(LazyInitFactory.class);
bd2.setPrimary(true);
lbf.registerBeanDefinition("bd1", bd1);
lbf.registerBeanDefinition("bd2", bd2);
LazyInitFactory bd1FactoryBean = (LazyInitFactory) lbf.getBean("&bd1");
LazyInitFactory bd2FactoryBean = (LazyInitFactory) lbf.getBean("&bd2");
assertThat(bd1FactoryBean).isNotNull();
assertThat(bd2FactoryBean).isNotNull();
FactoryBeanDependentBean bean = (FactoryBeanDependentBean) lbf.autowire(FactoryBeanDependentBean.class,
AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
assertThat(bean.getFactoryBean()).isNotEqualTo(bd1FactoryBean);
@@ -1915,6 +1965,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(LazyInitFactory.class);
lbf.registerBeanDefinition("factoryBean", bd);
LazyInitFactory factoryBean = (LazyInitFactory) lbf.getBean("&factoryBean");
assertThat(factoryBean).as("The FactoryBean should have been registered.").isNotNull();
assertThatExceptionOfType(TypeMismatchException.class).isThrownBy(() ->
lbf.autowire(FactoryBeanDependentBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true));
@@ -1926,6 +1977,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("test", bd);
lbf.registerBeanDefinition("spouse", bd2);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true))
.withMessageContaining("test")
@@ -1966,6 +2018,7 @@ class DefaultListableBeanFactoryTests {
bd2.setPrimary(true);
lbf.registerBeanDefinition("test", bd);
lbf.registerBeanDefinition("spouse", bd2);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true))
.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class);
@@ -1991,6 +2044,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd2 = new RootBeanDefinition(HighPriorityTestBean.class);
lbf.registerBeanDefinition("test", bd);
lbf.registerBeanDefinition("spouse", bd2);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true))
.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class)
@@ -2030,6 +2084,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("spouse", bd);
DependenciesBean existingBean = new DependenciesBean();
lbf.autowireBeanProperties(existingBean, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true);
TestBean spouse = (TestBean) lbf.getBean("spouse");
assertThat(spouse).isEqualTo(existingBean.getSpouse());
assertThat(BeanFactoryUtils.beanOfType(lbf, TestBean.class)).isSameAs(spouse);
@@ -2040,6 +2095,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
lbf.registerBeanDefinition("spous", bd);
DependenciesBean existingBean = new DependenciesBean();
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
lbf.autowireBeanProperties(existingBean, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true));
}
@@ -2050,6 +2106,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("spous", bd);
DependenciesBean existingBean = new DependenciesBean();
lbf.autowireBeanProperties(existingBean, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);
assertThat(existingBean.getSpouse()).isNull();
}
@@ -2059,6 +2116,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("test", bd);
DependenciesBean existingBean = new DependenciesBean();
lbf.autowireBeanProperties(existingBean, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
TestBean test = (TestBean) lbf.getBean("test");
assertThat(test).isEqualTo(existingBean.getSpouse());
}
@@ -2150,6 +2208,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
bd.setPropertyValues(pvs);
lbf.registerBeanDefinition("test", bd);
TestBean tb = new TestBean();
assertThat(tb.getAge()).isEqualTo(0);
lbf.configureBean(tb, "test");
@@ -2167,6 +2226,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition tbd = new RootBeanDefinition(TestBean.class);
tbd.setAutowireMode(RootBeanDefinition.AUTOWIRE_BY_NAME);
lbf.registerBeanDefinition("test", tbd);
TestBean tb = new TestBean();
lbf.configureBean(tb, "test");
assertThat(tb.getBeanFactory()).isSameAs(lbf);
@@ -2184,6 +2244,7 @@ class DefaultListableBeanFactoryTests {
lbf.registerBeanDefinition("bean" + i, bd);
}
lbf.preInstantiateSingletons();
for (int i = 0; i < 1000; i++) {
TestBean bean = (TestBean) lbf.getBean("bean" + i);
TestBean otherBean = (TestBean) lbf.getBean("bean" + (i < 99 ? i + 1 : 0));
@@ -2196,6 +2257,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(ConstructorDependencyBean.class);
bd.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
lbf.registerBeanDefinition("test", bd);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(lbf::preInstantiateSingletons);
}
@@ -2204,6 +2266,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(ConstructorDependencyFactoryBean.class);
bd.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
lbf.registerBeanDefinition("test", bd);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(lbf::preInstantiateSingletons);
}
@@ -2212,6 +2275,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(ConstructorDependencyFactoryBean.class);
bd.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
lbf.registerBeanDefinition("test", bd);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() -> lbf.getBeansOfType(String.class));
}
@@ -2239,12 +2303,14 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(ConstructorDependencyWithClassResolution.class);
bd.getConstructorArgumentValues().addGenericArgumentValue("java.lang.Strin");
lbf.registerBeanDefinition("test", bd);
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(lbf::preInstantiateSingletons);
}
@Test
void beanDefinitionWithInterface() {
lbf.registerBeanDefinition("test", new RootBeanDefinition(ITestBean.class));
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(() ->
lbf.getBean("test"))
.withMessageContaining("interface")
@@ -2254,6 +2320,7 @@ class DefaultListableBeanFactoryTests {
@Test
void beanDefinitionWithAbstractClass() {
lbf.registerBeanDefinition("test", new RootBeanDefinition(AbstractBeanFactory.class));
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(() ->
lbf.getBean("test"))
.withMessageContaining("abstract")
@@ -2297,6 +2364,7 @@ class DefaultListableBeanFactoryTests {
void lazyInitFactory() {
lbf.registerBeanDefinition("test", new RootBeanDefinition(LazyInitFactory.class));
lbf.preInstantiateSingletons();
LazyInitFactory factory = (LazyInitFactory) lbf.getBean("&test");
assertThat(factory.initialized).isFalse();
}
@@ -2305,6 +2373,7 @@ class DefaultListableBeanFactoryTests {
void smartInitFactory() {
lbf.registerBeanDefinition("test", new RootBeanDefinition(EagerInitFactory.class));
lbf.preInstantiateSingletons();
EagerInitFactory factory = (EagerInitFactory) lbf.getBean("&test");
assertThat(factory.initialized).isTrue();
}
@@ -2315,6 +2384,7 @@ class DefaultListableBeanFactoryTests {
stringDef.setScope(BeanDefinition.SCOPE_PROTOTYPE);
stringDef.getConstructorArgumentValues().addGenericArgumentValue(new TypedStringValue("value"));
lbf.registerBeanDefinition("string", stringDef);
String val1 = lbf.getBean("string", String.class);
String val2 = lbf.getBean("string", String.class);
assertThat(val1).isEqualTo("value");
@@ -2329,9 +2399,11 @@ class DefaultListableBeanFactoryTests {
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
bd.getConstructorArgumentValues().addGenericArgumentValue(list);
lbf.registerBeanDefinition("test", bd);
DerivedTestBean tb = (DerivedTestBean) lbf.getBean("test");
assertThat(tb.getName()).isEqualTo("myName");
assertThat(tb.getBeanName()).isEqualTo("myBeanName");
DerivedTestBean tb2 = (DerivedTestBean) lbf.getBean("test");
assertThat(tb != tb2).isTrue();
assertThat(tb2.getName()).isEqualTo("myName");
@@ -2346,9 +2418,11 @@ class DefaultListableBeanFactoryTests {
bd.setFactoryMethodName("create");
bd.getConstructorArgumentValues().addGenericArgumentValue(list);
lbf.registerBeanDefinition("test", bd);
DerivedTestBean tb = (DerivedTestBean) lbf.getBean("test");
assertThat(tb.getName()).isEqualTo("myName");
assertThat(tb.getBeanName()).isEqualTo("myBeanName");
DerivedTestBean tb2 = (DerivedTestBean) lbf.getBean("test");
assertThat(tb != tb2).isTrue();
assertThat(tb2.getName()).isEqualTo("myName");
@@ -2361,6 +2435,7 @@ class DefaultListableBeanFactoryTests {
bd.setInitMethodNames("init1", "init2");
bd.setDestroyMethodNames("destroy2", "destroy1");
lbf.registerBeanDefinition("test", bd);
BeanWithInitAndDestroyMethods bean = lbf.getBean("test", BeanWithInitAndDestroyMethods.class);
assertThat(bean.initMethods).containsExactly("init", "init1", "init2");
assertThat(bean.destroyMethods).isEmpty();
@@ -2378,6 +2453,7 @@ class DefaultListableBeanFactoryTests {
return new TestBean();
}
});
BeanWithDisposableBean.closed = false;
lbf.preInstantiateSingletons();
lbf.destroySingletons();
@@ -2394,6 +2470,7 @@ class DefaultListableBeanFactoryTests {
return new TestBean();
}
});
BeanWithDisposableBean.closed = false;
lbf.preInstantiateSingletons();
lbf.destroySingletons();
@@ -2411,6 +2488,7 @@ class DefaultListableBeanFactoryTests {
return new TestBean();
}
});
BeanWithDestroyMethod.closeCount = 0;
lbf.preInstantiateSingletons();
lbf.destroySingletons();
@@ -2615,6 +2693,7 @@ class DefaultListableBeanFactoryTests {
}
});
lbf.preInstantiateSingletons();
TestBean tb = (TestBean) lbf.getBean("test");
assertThat(tb.getName()).as("Name was set on field by IAPP").isEqualTo(nameSetOnField);
if (!skipPropertyPopulation) {
@@ -2658,6 +2737,7 @@ class DefaultListableBeanFactoryTests {
bd.setFactoryMethodName("of");
bd.getConstructorArgumentValues().addGenericArgumentValue("CONTENT");
lbf.registerBeanDefinition("optionalBean", bd);
assertThat((Optional<?>) lbf.getBean(Optional.class)).isEqualTo(Optional.of("CONTENT"));
}
@@ -2666,6 +2746,7 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(Optional.class);
bd.setFactoryMethodName("empty");
lbf.registerBeanDefinition("optionalBean", bd);
assertThat((Optional<?>) lbf.getBean(Optional.class)).isSameAs(Optional.empty());
}
@@ -2674,18 +2755,21 @@ class DefaultListableBeanFactoryTests {
RootBeanDefinition bd = new RootBeanDefinition(NonPublicEnumHolder.class);
bd.getConstructorArgumentValues().addGenericArgumentValue("VALUE_1");
lbf.registerBeanDefinition("holderBean", bd);
NonPublicEnumHolder holder = (NonPublicEnumHolder) lbf.getBean("holderBean");
assertThat(holder.getNonPublicEnum()).isEqualTo(NonPublicEnum.VALUE_1);
}
@SuppressWarnings("deprecation")
private int registerBeanDefinitions(Properties p) {
return (new org.springframework.beans.factory.support.PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p);
return registerBeanDefinitions(p, null);
}
@SuppressWarnings("deprecation")
private int registerBeanDefinitions(Properties p, String prefix) {
private int registerBeanDefinitions(Properties p, @Nullable String prefix) {
for (String beanName : lbf.getBeanDefinitionNames()) {
lbf.removeBeanDefinition(beanName);
}
return (new org.springframework.beans.factory.support.PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p, prefix);
}