@@ -169,7 +169,6 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
169
169
private final ThreadLocal <Object > prototypesCurrentlyInCreation =
170
170
new NamedThreadLocal <Object >("Prototype beans currently in creation" );
171
171
172
-
173
172
/**
174
173
* Create a new AbstractBeanFactory.
175
174
*/
@@ -398,7 +397,7 @@ else if (containsSingleton(beanName)) {
398
397
return parentBeanFactory .isSingleton (originalBeanName (name ));
399
398
}
400
399
401
- RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName );
400
+ RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName , true );
402
401
403
402
// In case of FactoryBean, return singleton status of created object if not a dereference.
404
403
if (mbd .isSingleton ()) {
@@ -428,7 +427,7 @@ public boolean isPrototype(String name) throws NoSuchBeanDefinitionException {
428
427
return parentBeanFactory .isPrototype (originalBeanName (name ));
429
428
}
430
429
431
- RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName );
430
+ RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName , true );
432
431
if (mbd .isPrototype ()) {
433
432
// In case of FactoryBean, return singleton status of created object if not a dereference.
434
433
return (!BeanFactoryUtils .isFactoryDereference (name ) || isFactoryBean (beanName , mbd ));
@@ -495,7 +494,7 @@ else if (containsSingleton(beanName) && !containsBeanDefinition(beanName)) {
495
494
}
496
495
497
496
// Retrieve corresponding bean definition.
498
- RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName );
497
+ RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName , true );
499
498
500
499
Class [] typesToMatch = (FactoryBean .class .equals (typeToMatch ) ?
501
500
new Class [] {typeToMatch } : new Class [] {FactoryBean .class , typeToMatch });
@@ -560,13 +559,13 @@ else if (containsSingleton(beanName) && !containsBeanDefinition(beanName)) {
560
559
return parentBeanFactory .getType (originalBeanName (name ));
561
560
}
562
561
563
- RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName );
562
+ RootBeanDefinition mbd = getMergedLocalBeanDefinition (beanName , true );
564
563
565
564
// Check decorated bean definition, if any: We assume it'll be easier
566
565
// to determine the decorated bean's type than the proxy's type.
567
566
BeanDefinitionHolder dbd = mbd .getDecoratedDefinition ();
568
567
if (dbd != null && !BeanFactoryUtils .isFactoryDereference (name )) {
569
- RootBeanDefinition tbd = getMergedBeanDefinition (dbd .getBeanName (), dbd .getBeanDefinition (), mbd );
568
+ RootBeanDefinition tbd = getMergedBeanDefinition (dbd .getBeanName (), dbd .getBeanDefinition (), mbd , true );
570
569
Class <?> targetClass = predictBeanType (dbd .getBeanName (), tbd );
571
570
if (targetClass != null && !FactoryBean .class .isAssignableFrom (targetClass )) {
572
571
return targetClass ;
@@ -901,7 +900,7 @@ else if (containsSingleton(beanName)) {
901
900
return ((ConfigurableBeanFactory ) getParentBeanFactory ()).isFactoryBean (name );
902
901
}
903
902
904
- return isFactoryBean (beanName , getMergedLocalBeanDefinition (beanName ));
903
+ return isFactoryBean (beanName , getMergedLocalBeanDefinition (beanName , true ));
905
904
}
906
905
907
906
@ Override
@@ -1094,12 +1093,17 @@ protected void registerCustomEditors(PropertyEditorRegistry registry) {
1094
1093
* @throws BeanDefinitionStoreException in case of an invalid bean definition
1095
1094
*/
1096
1095
protected RootBeanDefinition getMergedLocalBeanDefinition (String beanName ) throws BeansException {
1096
+ return getMergedLocalBeanDefinition (beanName , false );
1097
+ }
1098
+
1099
+ protected RootBeanDefinition getMergedLocalBeanDefinition (String beanName ,
1100
+ boolean forReadOnly ) throws BeansException {
1097
1101
// Quick check on the concurrent map first, with minimal locking.
1098
1102
RootBeanDefinition mbd = this .mergedBeanDefinitions .get (beanName );
1099
1103
if (mbd != null ) {
1100
1104
return mbd ;
1101
1105
}
1102
- return getMergedBeanDefinition (beanName , getBeanDefinition (beanName ));
1106
+ return getMergedBeanDefinition (beanName , getBeanDefinition (beanName ), null , forReadOnly );
1103
1107
}
1104
1108
1105
1109
/**
@@ -1129,6 +1133,27 @@ protected RootBeanDefinition getMergedBeanDefinition(String beanName, BeanDefini
1129
1133
protected RootBeanDefinition getMergedBeanDefinition (
1130
1134
String beanName , BeanDefinition bd , BeanDefinition containingBd )
1131
1135
throws BeanDefinitionStoreException {
1136
+ return getMergedBeanDefinition (beanName , bd , containingBd , false );
1137
+ }
1138
+
1139
+ /**
1140
+ * Return a RootBeanDefinition for the given bean, by merging with the
1141
+ * parent if the given bean's definition is a child bean definition.
1142
+ * @param beanName the name of the bean definition
1143
+ * @param bd the original bean definition (Root/ChildBeanDefinition)
1144
+ * @param containingBd the containing bean definition in case of inner bean,
1145
+ * or {@code null} in case of a top-level bean
1146
+ * @return a (potentially merged) RootBeanDefinition for the given bean
1147
+ * @throws BeanDefinitionStoreException in case of an invalid bean definition
1148
+ */
1149
+ protected RootBeanDefinition getMergedBeanDefinition (
1150
+ String beanName , BeanDefinition bd , BeanDefinition containingBd ,
1151
+ boolean forReadOnly )
1152
+ throws BeanDefinitionStoreException {
1153
+
1154
+ if (forReadOnly && bd .getParentName () == null && bd instanceof RootBeanDefinition ) {
1155
+ return (RootBeanDefinition ) bd ;
1156
+ }
1132
1157
1133
1158
synchronized (this .mergedBeanDefinitions ) {
1134
1159
RootBeanDefinition mbd = null ;
0 commit comments