Merge branch '1.5.x' into 2.0.x

pull/13815/head
Andy Wilkinson 6 years ago
commit 67dfa0a720

@ -77,7 +77,7 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
private final Map<String, Class<?>> beanTypes = new HashMap<>();
private int lastBeanDefinitionCount = 0;
private final Map<String, RootBeanDefinition> beanDefinitions = new HashMap<>();
private BeanTypeRegistry(DefaultListableBeanFactory beanFactory) {
this.beanFactory = beanFactory;
@ -142,7 +142,7 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
public void afterSingletonsInstantiated() {
// We're done at this point, free up some memory
this.beanTypes.clear();
this.lastBeanDefinitionCount = 0;
this.beanDefinitions.clear();
}
private void addBeanType(String name) {
@ -155,9 +155,22 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
}
private void addBeanTypeForNonAliasDefinition(String name) {
addBeanTypeForNonAliasDefinition(name, getBeanDefinition(name));
}
private RootBeanDefinition getBeanDefinition(String name) {
try {
return (RootBeanDefinition) this.beanFactory.getMergedBeanDefinition(name);
}
catch (BeanDefinitionStoreException ex) {
logIgnoredError("unresolvable metadata in bean definition", name, ex);
return null;
}
}
private void addBeanTypeForNonAliasDefinition(String name,
RootBeanDefinition beanDefinition) {
try {
RootBeanDefinition beanDefinition = (RootBeanDefinition) this.beanFactory
.getMergedBeanDefinition(name);
if (!beanDefinition.isAbstract()
&& !requiresEagerInit(beanDefinition.getFactoryBeanName())) {
String factoryName = BeanFactory.FACTORY_BEAN_PREFIX + name;
@ -172,15 +185,12 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
this.beanTypes.put(name, this.beanFactory.getType(name));
}
}
this.beanDefinitions.put(name, beanDefinition);
}
catch (CannotLoadBeanClassException ex) {
// Probably contains a placeholder
logIgnoredError("bean class loading failure for bean", name, ex);
}
catch (BeanDefinitionStoreException ex) {
// Probably contains a placeholder
logIgnoredError("unresolvable metadata in bean definition", name, ex);
}
}
private void logIgnoredError(String message, String name, Exception ex) {
@ -195,15 +205,24 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
}
private void updateTypesIfNecessary() {
if (this.lastBeanDefinitionCount != this.beanFactory.getBeanDefinitionCount()) {
Iterator<String> names = this.beanFactory.getBeanNamesIterator();
while (names.hasNext()) {
String name = names.next();
if (!this.beanTypes.containsKey(name)) {
addBeanType(name);
}
else {
if (!this.beanFactory.isAlias(name)
&& !this.beanFactory.containsSingleton(name)) {
RootBeanDefinition beanDefinition = getBeanDefinition(name);
RootBeanDefinition existingDefinition = this.beanDefinitions.put(name,
beanDefinition);
if (existingDefinition != null
&& !beanDefinition.equals(existingDefinition)) {
addBeanTypeForNonAliasDefinition(name, beanDefinition);
}
}
}
this.lastBeanDefinitionCount = this.beanFactory.getBeanDefinitionCount();
}
}

@ -1,5 +1,5 @@
/*
* Copyright 2012-2017 the original author or authors.
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -137,6 +137,16 @@ public class ConditionalOnBeanTests {
assertThat(context.getBean("bar")).isEqualTo("bar");
}
@Test
public void conditionEvaluationConsidersChangeInTypeWhenBeanIsOverridden() {
this.context.register(OriginalDefinition.class, OverridingDefinition.class,
ConsumingConfiguration.class);
this.context.refresh();
assertThat(this.context.containsBean("testBean")).isTrue();
assertThat(this.context.getBean(Integer.class)).isEqualTo(1);
assertThat(this.context.getBeansOfType(ConsumingConfiguration.class)).isEmpty();
}
@Configuration
@ConditionalOnBean(name = "foo")
protected static class OnBeanNameConfiguration {
@ -309,4 +319,35 @@ public class ConditionalOnBeanTests {
}
@Configuration
public static class OriginalDefinition {
@Bean
public String testBean() {
return "test";
}
}
@Configuration
@ConditionalOnBean(String.class)
public static class OverridingDefinition {
@Bean
public Integer testBean() {
return 1;
}
}
@Configuration
@ConditionalOnBean(String.class)
public static class ConsumingConfiguration {
ConsumingConfiguration(String testBean) {
}
}
}

Loading…
Cancel
Save