Revised naming for prototype inner beans to avoid excessive unique name calculation
Restored original singleton-only adaptInnerBeanName behavior, avoiding endless unique name calculation for every single prototype instance. Non-named inner BeanDefinition objects now suffixed with an identity hex code analogous to non-named XML bean definitions, largely avoiding naming collisions to begin with. After SPR-11246, post-processors can deal with unstable classes per bean name, so occasional collisions aren't a hard problem anymore.
Issue: SPR-11545
(cherry picked from commit 5308b3e)
This commit is contained in:
@@ -129,6 +129,15 @@
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<bean id="hasInnerBeansAsPrototype" class="org.springframework.tests.sample.beans.TestBean" scope="prototype">
|
||||
<constructor-arg>
|
||||
<bean id="innerBean" class="org.springframework.tests.sample.beans.TestBean" destroy-method="destroy">
|
||||
<constructor-arg><value>inner1</value></constructor-arg>
|
||||
<constructor-arg type="int"><value>6</value></constructor-arg>
|
||||
</bean>
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<bean id="hasInnerBeansWithoutDestroy" class="org.springframework.tests.sample.beans.TestBean">
|
||||
<constructor-arg><value>hasInner</value></constructor-arg>
|
||||
<constructor-arg index="1" type="int"><value>5</value></constructor-arg>
|
||||
|
||||
@@ -27,8 +27,8 @@ import java.net.URL;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
@@ -66,14 +66,12 @@ import org.springframework.util.FileCopyUtils;
|
||||
import org.springframework.util.SerializationTestUtils;
|
||||
import org.springframework.util.StopWatch;
|
||||
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Miscellaneous tests for XML bean definitions.
|
||||
*
|
||||
*
|
||||
* @author Juergen Hoeller
|
||||
* @author Rod Johnson
|
||||
* @author Rick Evans
|
||||
@@ -230,6 +228,20 @@ public final class XmlBeanFactoryTests {
|
||||
assertEquals("inner1", innerForConstructor.getName());
|
||||
assertEquals(6, innerForConstructor.getAge());
|
||||
|
||||
hasInnerBeansForConstructor = (TestBean) xbf.getBean("hasInnerBeansAsPrototype");
|
||||
innerForConstructor = (TestBean) hasInnerBeansForConstructor.getSpouse();
|
||||
assertNotNull(innerForConstructor);
|
||||
assertEquals("innerBean", innerForConstructor.getBeanName());
|
||||
assertEquals("inner1", innerForConstructor.getName());
|
||||
assertEquals(6, innerForConstructor.getAge());
|
||||
|
||||
hasInnerBeansForConstructor = (TestBean) xbf.getBean("hasInnerBeansAsPrototype");
|
||||
innerForConstructor = (TestBean) hasInnerBeansForConstructor.getSpouse();
|
||||
assertNotNull(innerForConstructor);
|
||||
assertEquals("innerBean", innerForConstructor.getBeanName());
|
||||
assertEquals("inner1", innerForConstructor.getName());
|
||||
assertEquals(6, innerForConstructor.getAge());
|
||||
|
||||
xbf.destroySingletons();
|
||||
assertTrue(inner1.wasDestroyed());
|
||||
assertTrue(inner2.wasDestroyed());
|
||||
@@ -390,11 +402,11 @@ public final class XmlBeanFactoryTests {
|
||||
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
|
||||
reader.loadBeanDefinitions(OVERRIDES_CONTEXT);
|
||||
|
||||
TestBean david = (TestBean)xbf.getBean("magicDavid");
|
||||
TestBean david = (TestBean) xbf.getBean("magicDavid");
|
||||
// the parent bean is autowiring
|
||||
assertNotNull(david.getSpouse());
|
||||
|
||||
TestBean derivedDavid = (TestBean)xbf.getBean("magicDavidDerived");
|
||||
TestBean derivedDavid = (TestBean) xbf.getBean("magicDavidDerived");
|
||||
// this fails while it inherits from the child bean
|
||||
assertNull("autowiring not propagated along child relationships", derivedDavid.getSpouse());
|
||||
}
|
||||
@@ -492,7 +504,7 @@ public final class XmlBeanFactoryTests {
|
||||
DefaultListableBeanFactory child = new DefaultListableBeanFactory(parent);
|
||||
new XmlBeanDefinitionReader(child).loadBeanDefinitions(CHILD_CONTEXT);
|
||||
TestBean inherits = (TestBean) child.getBean("singletonInheritsFromParentFactoryPrototype");
|
||||
// Name property value is overriden
|
||||
// Name property value is overridden
|
||||
assertTrue(inherits.getName().equals("prototype-override"));
|
||||
// Age property is inherited from bean in parent factory
|
||||
assertTrue(inherits.getAge() == 2);
|
||||
|
||||
Reference in New Issue
Block a user