diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java index cda8e8547a0..8dfb08292d0 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java @@ -128,6 +128,7 @@ final class ConfigurationClass { * @param metadata the metadata for the underlying class to represent * @param beanName name of the {@code @Configuration} class bean * @param scanned whether the underlying class has been registered through a scan + * @since 6.2 */ ConfigurationClass(AnnotationMetadata metadata, String beanName, boolean scanned) { Assert.notNull(beanName, "Bean name must not be null"); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java index a9184ad3081..59cbd37af6c 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java @@ -18,10 +18,7 @@ package org.springframework.context.annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Set; @@ -194,13 +191,19 @@ class ConfigurationClassBeanDefinitionReader { AnnotationAttributes bean = AnnotationConfigUtils.attributesFor(metadata, Bean.class); Assert.state(bean != null, "No @Bean annotation attributes"); - // Consider name and any aliases - List names = new ArrayList<>(Arrays.asList(bean.getStringArray("name"))); - String beanName = (!names.isEmpty() ? names.remove(0) : methodName); - - // Register aliases even when overridden - for (String alias : names) { - this.registry.registerAlias(beanName, alias); + // Consider name and any aliases. + String[] explicitNames = bean.getStringArray("name"); + String beanName; + if (explicitNames.length > 0) { + beanName = explicitNames[0]; + // Register aliases even when overridden below. + for (int i = 1; i < explicitNames.length; i++) { + this.registry.registerAlias(beanName, explicitNames[i]); + } + } + else { + // Default bean name derived from method name. + beanName = methodName; } // Has this effectively been overridden before (for example, via XML)? diff --git a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationBeanNameTests.java b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationBeanNameTests.java index b63b0309cb0..27f16741338 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationBeanNameTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationBeanNameTests.java @@ -64,8 +64,7 @@ class ConfigurationBeanNameTests { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.setBeanNameGenerator(new AnnotationBeanNameGenerator() { @Override - public String generateBeanName( - BeanDefinition definition, BeanDefinitionRegistry registry) { + public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { return "custom-" + super.generateBeanName(definition, registry); } }); @@ -78,17 +77,22 @@ class ConfigurationBeanNameTests { ctx.close(); } + @Configuration("outer") @Import(C.class) static class A { + @Component("nested") static class B { + @Bean public String nestedBean() { return ""; } } } + @Configuration("imported") static class C { + @Bean public String s() { return "s"; } } diff --git a/spring-context/src/test/java/org/springframework/context/annotation6/ComponentForScanning.java b/spring-context/src/test/java/org/springframework/context/annotation6/ComponentForScanning.java index 5f9448c536c..2832bd493f3 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation6/ComponentForScanning.java +++ b/spring-context/src/test/java/org/springframework/context/annotation6/ComponentForScanning.java @@ -20,4 +20,5 @@ import org.springframework.stereotype.Component; @Component public class ComponentForScanning { + } diff --git a/spring-context/src/test/java/org/springframework/context/annotation6/ConfigForScanning.java b/spring-context/src/test/java/org/springframework/context/annotation6/ConfigForScanning.java index 76efe3bf90a..9bf010d4187 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation6/ConfigForScanning.java +++ b/spring-context/src/test/java/org/springframework/context/annotation6/ConfigForScanning.java @@ -22,8 +22,10 @@ import org.springframework.context.annotation.Configuration; @Configuration public class ConfigForScanning { + @Bean public TestBean testBean() { return new TestBean(); } + }