Skip to content

Commit 401f959

Browse files
committed
Caching of autowire candidate metadata for injection point matching
Closes gh-24904
1 parent 0552102 commit 401f959

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
@@ -165,6 +165,9 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
165165
/** Map of bean definition objects, keyed by bean name. */
166166
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
167167

168+
/** Map from bean name to merged BeanDefinitionHolder. */
169+
private final Map<String, BeanDefinitionHolder> mergedBeanDefinitionHolders = new ConcurrentHashMap<>(256);
170+
168171
/** Map of singleton and non-singleton bean names, keyed by dependency type. */
169172
private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);
170173

@@ -794,8 +797,11 @@ protected boolean isAutowireCandidate(String beanName, RootBeanDefinition mbd,
794797
if (mbd.isFactoryMethodUnique && mbd.factoryMethodToIntrospect == null) {
795798
new ConstructorResolver(this).resolveFactoryMethodIfPossible(mbd);
796799
}
797-
return resolver.isAutowireCandidate(
798-
new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName)), descriptor);
800+
BeanDefinitionHolder holder = (beanName.equals(beanDefinitionName) ?
801+
this.mergedBeanDefinitionHolders.computeIfAbsent(beanName,
802+
key -> new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName))) :
803+
new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName)));
804+
return resolver.isAutowireCandidate(holder, descriptor);
799805
}
800806

801807
@Override
@@ -818,9 +824,16 @@ public Iterator<String> getBeanNamesIterator() {
818824
return iterator;
819825
}
820826

827+
@Override
828+
protected void clearMergedBeanDefinition(String beanName) {
829+
super.clearMergedBeanDefinition(beanName);
830+
this.mergedBeanDefinitionHolders.remove(beanName);
831+
}
832+
821833
@Override
822834
public void clearMetadataCache() {
823835
super.clearMetadataCache();
836+
this.mergedBeanDefinitionHolders.clear();
824837
clearByTypeCache();
825838
}
826839

0 commit comments

Comments
 (0)