Skip to content

Commit 91316dc

Browse files
committed
Caching of autowire candidate metadata for injection point matching
Closes gh-24904
1 parent ac8d1df commit 91316dc

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
162162
/** Map of bean definition objects, keyed by bean name. */
163163
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
164164

165+
/** Map from bean name to merged BeanDefinitionHolder. */
166+
private final Map<String, BeanDefinitionHolder> mergedBeanDefinitionHolders = new ConcurrentHashMap<>(256);
167+
165168
/** Map of singleton and non-singleton bean names, keyed by dependency type. */
166169
private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);
167170

@@ -759,8 +762,11 @@ protected boolean isAutowireCandidate(String beanName, RootBeanDefinition mbd,
759762
if (mbd.isFactoryMethodUnique && mbd.factoryMethodToIntrospect == null) {
760763
new ConstructorResolver(this).resolveFactoryMethodIfPossible(mbd);
761764
}
762-
return resolver.isAutowireCandidate(
763-
new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName)), descriptor);
765+
BeanDefinitionHolder holder = (beanName.equals(beanDefinitionName) ?
766+
this.mergedBeanDefinitionHolders.computeIfAbsent(beanName,
767+
key -> new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName))) :
768+
new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName)));
769+
return resolver.isAutowireCandidate(holder, descriptor);
764770
}
765771

766772
@Override
@@ -783,9 +789,16 @@ public Iterator<String> getBeanNamesIterator() {
783789
return iterator;
784790
}
785791

792+
@Override
793+
protected void clearMergedBeanDefinition(String beanName) {
794+
super.clearMergedBeanDefinition(beanName);
795+
this.mergedBeanDefinitionHolders.remove(beanName);
796+
}
797+
786798
@Override
787799
public void clearMetadataCache() {
788800
super.clearMetadataCache();
801+
this.mergedBeanDefinitionHolders.clear();
789802
clearByTypeCache();
790803
}
791804

0 commit comments

Comments
 (0)