Open
Description
While I tried to customize an AutoConfiguration
, but @ConditionalOnBean
did not working, then I tried to find the problem through examples, source code, and the Internet, and used different configuration methods, and finally found that it was because of the registration order of BeanDefinition
.
In my opinion, their registration order should be like this:
- Configuration
- beans annotated on Configuration (e.g.
@Import
and@EnableConfigurationProperties
) - (static) InnerConfiguration
- @bean method
Then about ConfigurationClassParser
, the (static) InnerConfiguration
should be managed by the fields in ConfigurationClass
of Configuration
, and if the Conditional
of Configuration
is not matched, then InnerConfiguration should also be skipped, ConfigurationClassBeanDefinitionReader
will be like:
private void loadBeanDefinitionsForConfigurationClass(
ConfigurationClass configClass, TrackedConditionEvaluator trackedConditionEvaluator) {
if (trackedConditionEvaluator.shouldSkip(configClass)) {
String beanName = configClass.getBeanName();
if (StringUtils.hasLength(beanName) && this.registry.containsBeanDefinition(beanName)) {
this.registry.removeBeanDefinition(beanName);
}
this.importRegistry.removeImportingClass(configClass.getMetadata().getClassName());
return;
}
if (configClass.isImported()) {
registerBeanDefinitionForImportedConfigurationClass(configClass);
}
loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
loadBeanDefinitionsFromInnerConfigurationClass(configClass.getInnerConfigurationClass()); // something like this
for (BeanMethod beanMethod : configClass.getBeanMethods()) {
loadBeanDefinitionsForBeanMethod(beanMethod);
}
}