From 401f9599cadf7b368153f933a5aebdfc8d9e36cb Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 25 Apr 2020 16:34:28 +0200 Subject: [PATCH] Caching of autowire candidate metadata for injection point matching Closes gh-24904 --- .../support/DefaultListableBeanFactory.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index a1d60265043..3bffd264e2f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -165,6 +165,9 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto /** Map of bean definition objects, keyed by bean name. */ private final Map beanDefinitionMap = new ConcurrentHashMap<>(256); + /** Map from bean name to merged BeanDefinitionHolder. */ + private final Map mergedBeanDefinitionHolders = new ConcurrentHashMap<>(256); + /** Map of singleton and non-singleton bean names, keyed by dependency type. */ private final Map, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64); @@ -794,8 +797,11 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto if (mbd.isFactoryMethodUnique && mbd.factoryMethodToIntrospect == null) { new ConstructorResolver(this).resolveFactoryMethodIfPossible(mbd); } - return resolver.isAutowireCandidate( - new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName)), descriptor); + BeanDefinitionHolder holder = (beanName.equals(beanDefinitionName) ? + this.mergedBeanDefinitionHolders.computeIfAbsent(beanName, + key -> new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName))) : + new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName))); + return resolver.isAutowireCandidate(holder, descriptor); } @Override @@ -818,9 +824,16 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto return iterator; } + @Override + protected void clearMergedBeanDefinition(String beanName) { + super.clearMergedBeanDefinition(beanName); + this.mergedBeanDefinitionHolders.remove(beanName); + } + @Override public void clearMetadataCache() { super.clearMetadataCache(); + this.mergedBeanDefinitionHolders.clear(); clearByTypeCache(); }