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 bffe7e764fc..e88e04f4690 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 @@ -135,11 +135,11 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto /** Map of bean definition objects, keyed by bean name */ private final Map beanDefinitionMap = new ConcurrentHashMap(64); - /** Map of singleton bean names keyed by bean class */ - private final Map, String[]> singletonBeanNamesByType = new ConcurrentHashMap, String[]>(64); + /** Map of singleton and non-singleton bean names keyed by dependency type */ + private final Map, String[]> allBeanNamesByType = new ConcurrentHashMap, String[]>(64); - /** Map of non-singleton bean names keyed by bean class */ - private final Map, String[]> nonSingletonBeanNamesByType = new ConcurrentHashMap, String[]>(64); + /** Map of singleton-only bean names keyed by dependency type */ + private final Map, String[]> singletonBeanNamesByType = new ConcurrentHashMap, String[]>(64); /** List of bean definition names, in registration order */ private final List beanDefinitionNames = new ArrayList(); @@ -326,8 +326,8 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto if (!isConfigurationFrozen() || type == null || !allowEagerInit) { return doGetBeanNamesForType(type, includeNonSingletons, allowEagerInit); } - Map, String[]> cache = includeNonSingletons ? - this.nonSingletonBeanNamesByType : this.singletonBeanNamesByType; + Map, String[]> cache = + (includeNonSingletons ? this.allBeanNamesByType : this.singletonBeanNamesByType); String[] resolvedBeanNames = cache.get(type); if (resolvedBeanNames != null) { return resolvedBeanNames; @@ -707,9 +707,8 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto // (e.g. the default StaticMessageSource in a StaticApplicationContext). destroySingleton(beanName); - // Remove any assumptions about by-type mappings - this.singletonBeanNamesByType.clear(); - this.nonSingletonBeanNamesByType.clear(); + // Remove any assumptions about by-type mappings. + clearByTypeCache(); // Reset all bean definitions that have the given bean as parent (recursively). for (String bdName : this.beanDefinitionNames) { @@ -730,6 +729,26 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto return this.allowBeanDefinitionOverriding; } + @Override + public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException { + super.registerSingleton(beanName, singletonObject); + clearByTypeCache(); + } + + @Override + public void destroySingleton(String beanName) { + super.destroySingleton(beanName); + clearByTypeCache(); + } + + /** + * Remove any assumptions about by-type mappings. + */ + private void clearByTypeCache() { + this.allBeanNamesByType.clear(); + this.singletonBeanNamesByType.clear(); + } + //--------------------------------------------------------------------- // Dependency resolution functionality