Browse Source

Revise commit 01acb80501

See gh-35631
pull/35672/head
Sam Brannen 2 months ago
parent
commit
a96558c965
  1. 20
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java
  2. 38
      spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java
  3. 9
      spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationClassProcessingTests.java

20
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java

@ -117,13 +117,7 @@ class ConfigurationClassBeanDefinitionReader {
public void loadBeanDefinitions(Set<ConfigurationClass> configurationModel) { public void loadBeanDefinitions(Set<ConfigurationClass> configurationModel) {
TrackedConditionEvaluator trackedConditionEvaluator = new TrackedConditionEvaluator(); TrackedConditionEvaluator trackedConditionEvaluator = new TrackedConditionEvaluator();
for (ConfigurationClass configClass : configurationModel) { for (ConfigurationClass configClass : configurationModel) {
try { loadBeanDefinitionsForConfigurationClass(configClass, trackedConditionEvaluator);
loadBeanDefinitionsForConfigurationClass(configClass, trackedConditionEvaluator);
}
catch (Exception ex) {
throw new IllegalStateException("Failed to load bean definitions for configuration class '" +
configClass.getMetadata().getClassName() + "'", ex);
}
} }
} }
@ -163,9 +157,17 @@ class ConfigurationClassBeanDefinitionReader {
ScopeMetadata scopeMetadata = scopeMetadataResolver.resolveScopeMetadata(configBeanDef); ScopeMetadata scopeMetadata = scopeMetadataResolver.resolveScopeMetadata(configBeanDef);
configBeanDef.setScope(scopeMetadata.getScopeName()); configBeanDef.setScope(scopeMetadata.getScopeName());
String configBeanName = this.importBeanNameGenerator.generateBeanName(configBeanDef, this.registry);
AnnotationConfigUtils.processCommonDefinitionAnnotations(configBeanDef, metadata);
String configBeanName;
try {
configBeanName = this.importBeanNameGenerator.generateBeanName(configBeanDef, this.registry);
}
catch (IllegalArgumentException ex) {
throw new IllegalStateException("Failed to generate bean name for imported class '" +
configClass.getMetadata().getClassName() + "'", ex);
}
AnnotationConfigUtils.processCommonDefinitionAnnotations(configBeanDef, metadata);
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(configBeanDef, configBeanName); BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(configBeanDef, configBeanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry); definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
this.registry.registerBeanDefinition(definitionHolder.getBeanName(), definitionHolder.getBeanDefinition()); this.registry.registerBeanDefinition(definitionHolder.getBeanName(), definitionHolder.getBeanDefinition());

38
spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java

@ -410,35 +410,28 @@ class ConfigurationClassPostProcessorTests {
beanFactory.setAllowBeanDefinitionOverriding(false); beanFactory.setAllowBeanDefinitionOverriding(false);
ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor();
assertThatIllegalStateException() assertThatExceptionOfType(BeanDefinitionStoreException.class)
.isThrownBy(() -> pp.postProcessBeanFactory(beanFactory)) .isThrownBy(() -> pp.postProcessBeanFactory(beanFactory))
.withMessage("Failed to load bean definitions for configuration class '%s'", SingletonBeanConfig.class.getName()) .withMessageContainingAll(
.havingCause() "bar",
.isInstanceOf(BeanDefinitionStoreException.class) "SingletonBeanConfig",
.withMessageContainingAll( TestBean.class.getName()
"bar", );
"SingletonBeanConfig",
TestBean.class.getName()
);
} }
@Test // gh-25430 @Test // gh-25430
void detectAliasOverride() { void detectAliasOverride() {
Class<?> configClass = SecondConfiguration.class;
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory(); DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory();
beanFactory.setAllowBeanDefinitionOverriding(false); beanFactory.setAllowBeanDefinitionOverriding(false);
context.register(FirstConfiguration.class, configClass); context.register(FirstConfiguration.class, SecondConfiguration.class);
assertThatIllegalStateException().isThrownBy(context::refresh) assertThatIllegalStateException().isThrownBy(context::refresh)
.withMessage("Failed to load bean definitions for configuration class '%s'", configClass.getName()) .withMessageContainingAll(
.havingCause() "alias 'taskExecutor'",
.isExactlyInstanceOf(IllegalStateException.class) "name 'applicationTaskExecutor'",
.withMessageContainingAll( "bean definition 'taskExecutor'"
"alias 'taskExecutor'", );
"name 'applicationTaskExecutor'",
"bean definition 'taskExecutor'"
);
context.close(); context.close();
} }
@ -1171,11 +1164,8 @@ class ConfigurationClassPostProcessorTests {
@Test @Test
void nameClashBetweenConfigurationClassAndBean() { void nameClashBetweenConfigurationClassAndBean() {
assertThatIllegalStateException() assertThatExceptionOfType(BeanDefinitionStoreException.class)
.isThrownBy(() -> new AnnotationConfigApplicationContext(MyTestBean.class)) .isThrownBy(() -> new AnnotationConfigApplicationContext(MyTestBean.class));
.withMessage("Failed to load bean definitions for configuration class '%s'", MyTestBean.class.getName())
.havingCause()
.isInstanceOf(BeanDefinitionStoreException.class);
} }
@Test @Test

9
spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationClassProcessingTests.java

@ -60,7 +60,6 @@ import org.springframework.context.support.GenericApplicationContext;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
/** /**
* Miscellaneous system tests covering {@link Bean} naming, aliases, scoping and * Miscellaneous system tests covering {@link Bean} naming, aliases, scoping and
@ -223,12 +222,8 @@ class ConfigurationClassProcessingTests {
@Test // gh-33330 @Test // gh-33330
void configurationWithMethodNameMismatch() { void configurationWithMethodNameMismatch() {
Class<?> configClass = ConfigWithMethodNameMismatch.class; assertThatExceptionOfType(BeanDefinitionOverrideException.class)
assertThatIllegalStateException() .isThrownBy(() -> initBeanFactory(false, ConfigWithMethodNameMismatch.class));
.isThrownBy(() -> initBeanFactory(false, configClass))
.withMessage("Failed to load bean definitions for configuration class '%s'", configClass.getName())
.havingCause()
.isInstanceOf(BeanDefinitionOverrideException.class);
} }
@Test // gh-33920 @Test // gh-33920

Loading…
Cancel
Save