diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index 73f0f95c0108..1f48fedc2faa 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java @@ -1333,6 +1333,7 @@ private void copyRelevantMergedBeanDefinitionCaches(RootBeanDefinition previous, ObjectUtils.nullSafeEquals(mbd.getFactoryMethodName(), previous.getFactoryMethodName()) && (mbd.targetType == null || mbd.targetType.equals(previous.targetType))) { mbd.targetType = previous.targetType; + mbd.isFactoryBean = previous.isFactoryBean; mbd.resolvedTargetType = previous.resolvedTargetType; mbd.factoryMethodReturnType = previous.factoryMethodReturnType; mbd.factoryMethodToIntrospect = previous.factoryMethodToIntrospect; @@ -1541,8 +1542,13 @@ protected Class predictBeanType(String beanName, RootBeanDefinition mbd, Clas * @param mbd the corresponding bean definition */ protected boolean isFactoryBean(String beanName, RootBeanDefinition mbd) { - Class beanType = predictBeanType(beanName, mbd, FactoryBean.class); - return (beanType != null && FactoryBean.class.isAssignableFrom(beanType)); + Boolean result = mbd.isFactoryBean; + if (result == null) { + Class beanType = predictBeanType(beanName, mbd, FactoryBean.class); + result = beanType != null && FactoryBean.class.isAssignableFrom(beanType); + mbd.isFactoryBean = result; + } + return result; } /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java index f393829e7472..8422ad309ebf 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java @@ -74,6 +74,10 @@ public class RootBeanDefinition extends AbstractBeanDefinition { @Nullable volatile Class resolvedTargetType; + /** Package-visible field for caching if the bean is a factory bean. */ + @Nullable + volatile Boolean isFactoryBean; + /** Package-visible field for caching the return type of a generically typed factory method. */ @Nullable volatile ResolvableType factoryMethodReturnType;