From 527876d9a08e136c2fe07de162578de36cc344fb Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 18 Jul 2019 11:48:32 +0100 Subject: [PATCH] Cache AbstractBeanFactory.isFactoryBean results Add an additional cache to the `RootBeanDefinition` to save recalculating the result of `isFactoryBean`. Closes gh-23337 --- .../beans/factory/support/AbstractBeanFactory.java | 10 ++++++++-- .../beans/factory/support/RootBeanDefinition.java | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) 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 73f0f95c01..1f48fedc2f 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 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp 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 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * @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 f393829e74..8422ad309e 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;