diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index 4defe323d461..533a313d9504 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -754,7 +754,7 @@ protected Class getTypeForFactoryMethod(String beanName, RootBeanDefinition m clazz -> ReflectionUtils.getUniqueDeclaredMethods(clazz, ReflectionUtils.USER_DECLARED_METHODS)); for (Method candidate : candidates) { - if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate) && + if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate,beanName) && candidate.getParameterCount() >= minNrOfArgs) { // Declared type variables to inspect? if (candidate.getTypeParameters().length > 0) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java index d5d9b9f871df..7fad02b5f685 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java @@ -337,7 +337,7 @@ public void resolveFactoryMethodIfPossible(RootBeanDefinition mbd) { Method[] candidates = getCandidateMethods(factoryClass, mbd); Method uniqueCandidate = null; for (Method candidate : candidates) { - if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate)) { + if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate,null)) { if (uniqueCandidate == null) { uniqueCandidate = candidate; } @@ -465,7 +465,7 @@ public BeanWrapper instantiateUsingFactoryMethod( candidates = new ArrayList<>(); Method[] rawCandidates = getCandidateMethods(factoryClass, mbd); for (Method candidate : rawCandidates) { - if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate)) { + if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate,beanName)) { candidates.add(candidate); } } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java index d70c8040bde4..2de607622605 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java @@ -396,7 +396,7 @@ public void setNonUniqueFactoryMethodName(String name) { /** * Check whether the given candidate qualifies as a factory method. */ - public boolean isFactoryMethod(Method candidate) { + public boolean isFactoryMethod(Method candidate,String beanName) { return candidate.getName().equals(getFactoryMethodName()); } 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 5f884f6fb576..547360963a2c 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 @@ -430,8 +430,8 @@ public MethodMetadata getFactoryMethodMetadata() { } @Override - public boolean isFactoryMethod(Method candidate) { - return (super.isFactoryMethod(candidate) && BeanAnnotationHelper.isBeanAnnotated(candidate)); + public boolean isFactoryMethod(Method candidate,String beanName) { + return (super.isFactoryMethod(candidate,beanName) && BeanAnnotationHelper.isBeanAnnotated(candidate) && (beanName == null ? true :BeanAnnotationHelper.determineBeanNameFor(candidate).equals(beanName))); } @Override diff --git a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportedConfigurationClassEnhancementTests.java b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportedConfigurationClassEnhancementTests.java index df640ffbd72d..7325979f93d9 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportedConfigurationClassEnhancementTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ImportedConfigurationClassEnhancementTests.java @@ -23,8 +23,12 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.foo.SomeBean; +import org.springframework.context.annotation.foo.SomeConfig; +import org.springframework.context.annotation.foo.SomeOtherBean; import org.springframework.util.ClassUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -64,6 +68,15 @@ public void autowiredConfigClassBeanMethodsRespectScopingWhenRegisteredViaConstr autowiredConfigClassBeanMethodsRespectScoping(ConfigThatDoesNotImport.class, ConfigToBeAutowired.class); } + @Test + public void checkOverloadedBean(){ + ApplicationContext ctx = new AnnotationConfigApplicationContext("org.springframework.context.annotation.foo"); + SomeOtherBean someOtherBean =(SomeOtherBean) ctx.getBean("other"); + SomeBean someBean =(SomeBean) ctx.getBean("foo"); + assertThat(someBean).isNotNull(); + assertThat(someOtherBean).isNotNull(); + } + private void autowiredConfigClassBeanMethodsRespectScoping(Class... configClasses) { ApplicationContext ctx = new AnnotationConfigApplicationContext(configClasses); Config config = ctx.getBean(Config.class); @@ -83,7 +96,6 @@ public void importingNonConfigurationClassCausesBeanDefinitionParsingException() } - @Configuration static class ConfigToBeAutowired { diff --git a/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeBean.java b/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeBean.java new file mode 100644 index 000000000000..6582497dd488 --- /dev/null +++ b/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeBean.java @@ -0,0 +1,9 @@ +package org.springframework.context.annotation.foo; + +public class SomeBean { + private final SomeOtherBean other; + + public SomeBean(SomeOtherBean other) { + this.other = other; + } +} diff --git a/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeConfig.java b/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeConfig.java new file mode 100644 index 000000000000..8672153d1121 --- /dev/null +++ b/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeConfig.java @@ -0,0 +1,24 @@ +package org.springframework.context.annotation.foo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +public class SomeConfig { + + @Bean(name = "other") + public SomeOtherBean foo() { + System.out.println("constructing SomeOtherBean"); + return new SomeOtherBean(); + } + + @Bean(name = "foo") + public SomeBean foo(@Autowired SomeOtherBean other) { + System.out.println("constructing SomeBean"); + return new SomeBean(other); + } + + +} diff --git a/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeOtherBean.java b/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeOtherBean.java new file mode 100644 index 000000000000..b0124946005f --- /dev/null +++ b/spring-context/src/test/java/org/springframework/context/annotation/foo/SomeOtherBean.java @@ -0,0 +1,6 @@ +package org.springframework.context.annotation.foo; + +public class SomeOtherBean { + public SomeOtherBean() { + } +}