@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2013 the original author or authors .
* Copyright 2002 - 2014 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -81,6 +81,7 @@ class BeanDefinitionValueResolver {
this . typeConverter = typeConverter ;
}
/ * *
* Given a PropertyValue , return a value , resolving any references to other
* beans in the factory if necessary . The value could be :
@ -123,7 +124,9 @@ class BeanDefinitionValueResolver {
else if ( value instanceof BeanDefinition ) {
// Resolve plain BeanDefinition, without contained name: use dummy name.
BeanDefinition bd = ( BeanDefinition ) value ;
return resolveInnerBean ( argName , "(inner bean)" , bd ) ;
String innerBeanName = "(inner bean)" + BeanFactoryUtils . GENERATED_BEAN_NAME_SEPARATOR +
ObjectUtils . getIdentityHexString ( bd ) ;
return resolveInnerBean ( argName , innerBeanName , bd ) ;
}
else if ( value instanceof ManagedArray ) {
// May need to resolve contained runtime references.
@ -256,20 +259,25 @@ class BeanDefinitionValueResolver {
mbd = this . beanFactory . getMergedBeanDefinition ( innerBeanName , innerBd , this . beanDefinition ) ;
// Check given bean name whether it is unique. If not already unique,
// add counter - increasing the counter until the name is unique.
String actualInnerBeanName = adaptInnerBeanName ( innerBeanName ) ;
String actualInnerBeanName = innerBeanName ;
if ( mbd . isSingleton ( ) ) {
actualInnerBeanName = adaptInnerBeanName ( innerBeanName ) ;
}
this . beanFactory . registerContainedBean ( actualInnerBeanName , this . beanName ) ;
// Guarantee initialization of beans that the inner bean depends on.
String [ ] dependsOn = mbd . getDependsOn ( ) ;
if ( dependsOn ! = null ) {
for ( String dependsOnBean : dependsOn ) {
this . beanFactory . getBean ( dependsOnBean ) ;
this . beanFactory . registerDependentBean ( dependsOnBean , actualInnerBeanName ) ;
this . beanFactory . getBean ( dependsOnBean ) ;
}
}
// Actually create the inner bean instance now...
Object innerBean = this . beanFactory . createBean ( actualInnerBeanName , mbd , null ) ;
if ( innerBean instanceof FactoryBean ) {
boolean synthetic = mbd . isSynthetic ( ) ;
return this . beanFactory . getObjectFromFactoryBean ( ( FactoryBean < ? > ) innerBean , actualInnerBeanName , ! synthetic ) ;
return this . beanFactory . getObjectFromFactoryBean (
( FactoryBean < ? > ) innerBean , actualInnerBeanName , ! synthetic ) ;
}
else {
return innerBean ;