diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index 0ed2174ca45..5f89d16ddf6 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -31,7 +31,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; @@ -156,11 +155,14 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac private final NamedThreadLocal currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean"); /** Cache of unfinished FactoryBean instances: FactoryBean name to BeanWrapper. */ - private final Map factoryBeanInstanceCache = new ConcurrentHashMap<>(16); + private final ConcurrentMap factoryBeanInstanceCache = new ConcurrentHashMap<>(); + + /** Cache of candidate factory methods per factory class. */ + private final ConcurrentMap, Method[]> factoryMethodCandidateCache = new ConcurrentHashMap<>(); /** Cache of filtered PropertyDescriptors: bean Class to PropertyDescriptor array. */ private final ConcurrentMap, PropertyDescriptor[]> filteredPropertyDescriptorsCache = - new ConcurrentHashMap<>(256); + new ConcurrentHashMap<>(); /** @@ -716,7 +718,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac Method uniqueCandidate = null; int minNrOfArgs = (mbd.hasConstructorArgumentValues() ? mbd.getConstructorArgumentValues().getArgumentCount() : 0); - Method[] candidates = ReflectionUtils.getUniqueDeclaredMethods(factoryClass); + Method[] candidates = this.factoryMethodCandidateCache.computeIfAbsent( + factoryClass, ReflectionUtils::getUniqueDeclaredMethods); + for (Method candidate : candidates) { if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate) && candidate.getParameterCount() >= minNrOfArgs) {