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
This commit is contained in:
Juergen Hoeller
2014-03-14 20:38:09 +01:00
parent 9dcd03d862
commit 5308b3e358
3 changed files with 37 additions and 7 deletions

View File

@@ -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>

View File

@@ -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;
@@ -65,7 +65,6 @@ import org.springframework.util.ClassUtils;
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.*;
@@ -229,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());