Detect depends-on cycles and throw proper exception
Issue: SPR-7966
This commit is contained in:
@@ -286,8 +286,12 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
|
||||
String[] dependsOn = mbd.getDependsOn();
|
||||
if (dependsOn != null) {
|
||||
for (String dependsOnBean : dependsOn) {
|
||||
getBean(dependsOnBean);
|
||||
if (isDependent(beanName, dependsOnBean)) {
|
||||
throw new BeanCreationException("Circular depends-on relationship between '" +
|
||||
beanName + "' and '" + dependsOnBean + "'");
|
||||
}
|
||||
registerDependentBean(dependsOnBean, beanName);
|
||||
getBean(dependsOnBean);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -412,6 +412,28 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the specified dependent bean has been registered as
|
||||
* dependent on the given bean or on any of its transitive dependencies.
|
||||
* @param beanName the name of the bean to check
|
||||
* @param dependentBeanName the name of the dependent bean
|
||||
*/
|
||||
protected boolean isDependent(String beanName, String dependentBeanName) {
|
||||
Set<String> dependentBeans = this.dependentBeanMap.get(beanName);
|
||||
if (dependentBeans == null) {
|
||||
return false;
|
||||
}
|
||||
if (dependentBeans.contains(dependentBeanName)) {
|
||||
return true;
|
||||
}
|
||||
for (String transitiveDependency : dependentBeans) {
|
||||
if (isDependent(transitiveDependency, dependentBeanName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether a dependent bean has been registered for the given name.
|
||||
* @param beanName the name of the bean to check
|
||||
|
||||
Reference in New Issue
Block a user