From 3665355f2bef80ca66678532e854499257ace471 Mon Sep 17 00:00:00 2001 From: wangguogang Date: Tue, 30 Jun 2020 16:23:27 +0800 Subject: [PATCH 1/3] fixed Overloaded @Bean method causes bean to be created twice and other bean not to be created #25263 --- .../AbstractAutowireCapableBeanFactory.java | 2 +- .../factory/support/ConstructorResolver.java | 4 ++-- .../factory/support/RootBeanDefinition.java | 2 +- ...onfigurationClassBeanDefinitionReader.java | 4 ++-- ...tedConfigurationClassEnhancementTests.java | 14 ++++++++++- .../context/annotation/foo/SomeBean.java | 9 +++++++ .../context/annotation/foo/SomeConfig.java | 24 +++++++++++++++++++ .../context/annotation/foo/SomeOtherBean.java | 6 +++++ 8 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 spring-context/src/test/java/org/springframework/context/annotation/foo/SomeBean.java create mode 100644 spring-context/src/test/java/org/springframework/context/annotation/foo/SomeConfig.java create mode 100644 spring-context/src/test/java/org/springframework/context/annotation/foo/SomeOtherBean.java 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() { + } +} From ddbeef8ba7557d5a3ca254d2c738286d51c777f8 Mon Sep 17 00:00:00 2001 From: wangguogang Date: Tue, 30 Jun 2020 16:55:55 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BD=9C=E8=80=85?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/springframework/context/annotation/foo/SomeBean.java | 4 ++++ .../springframework/context/annotation/foo/SomeConfig.java | 5 ++++- .../context/annotation/foo/SomeOtherBean.java | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) 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 index 6582497dd488..9d23c881b92c 100644 --- 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 @@ -1,5 +1,9 @@ package org.springframework.context.annotation.foo; +/** + * @author lifejwang11 + * @since 5.2 + */ public class SomeBean { private final SomeOtherBean 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 index 8672153d1121..bd4ead5e8a8d 100644 --- 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 @@ -4,7 +4,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - +/** + * @author lifejwang11 + * @since 5.2 + */ @Configuration public class SomeConfig { 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 index b0124946005f..ab3f361b8bf3 100644 --- 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 @@ -1,5 +1,9 @@ package org.springframework.context.annotation.foo; +/** + * @author lifejwang11 + * @since 5.2 + */ public class SomeOtherBean { public SomeOtherBean() { } From 78eb79c2fa27153d4bd6d82ac8424826cd52337c Mon Sep 17 00:00:00 2001 From: wangguogang Date: Thu, 2 Jul 2020 19:56:08 +0800 Subject: [PATCH 3/3] fixed #25350 --- .../src/main/java/org/springframework/util/MimeType.java | 3 +++ .../src/test/java/org/springframework/util/MimeTypeTests.java | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/spring-core/src/main/java/org/springframework/util/MimeType.java b/spring-core/src/main/java/org/springframework/util/MimeType.java index 539be7f56167..8e11c1d01601 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeType.java +++ b/spring-core/src/main/java/org/springframework/util/MimeType.java @@ -377,6 +377,9 @@ else if (getType().equals(other.getType())) { if (getSubtype().equals(other.getSubtype())) { return true; } + if (WILDCARD_TYPE.equals(other.getSubtype())){ + return true; + } // Wildcard with suffix? e.g. application/*+xml if (isWildcardSubtype() || other.isWildcardSubtype()) { int thisPlusIdx = getSubtype().lastIndexOf('+'); diff --git a/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java b/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java index aa5fefc2e3c0..da230829a3be 100644 --- a/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java +++ b/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java @@ -172,6 +172,10 @@ void isCompatible() { assertThat(suffixXml.isCompatibleWith(applicationWildcardXml)).isTrue(); assertThat(applicationWildcardXml.isCompatibleWith(MimeTypeUtils.APPLICATION_JSON)).isFalse(); + + MimeType applicationJSON = new MimeType("application", "vnd+json"); + MimeType applicationWildcardJSON = new MimeType("application", "*"); + assertThat(applicationJSON.isCompatibleWith(applicationWildcardJSON)).isTrue(); } @Test