diff options
author | Emmanuel Bourg <ebourg@apache.org> | 2018-10-05 14:12:14 +0200 |
---|---|---|
committer | Emmanuel Bourg <ebourg@apache.org> | 2018-10-05 14:12:14 +0200 |
commit | 9a51aaff31d1c71a81ef349649af0de0bcbab3ff (patch) | |
tree | 7c7ac18ef2d5ce701da23f73b58e6b3e680b00a9 /spring-beans/src/main/java/org/springframework/beans/factory/support | |
parent | eb01d39c7dba3fcf60cddec0ac62cc633abe9b53 (diff) |
New upstream version 4.3.17
Diffstat (limited to 'spring-beans/src/main/java/org/springframework/beans/factory/support')
2 files changed, 18 insertions, 6 deletions
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 00adea84..de743f4d 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 @@ -727,7 +727,8 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac Class<?> returnType = AutowireUtils.resolveReturnTypeForFactoryMethod( factoryMethod, args, getBeanClassLoader()); if (returnType != null) { - uniqueCandidate = (commonType == null ? factoryMethod : null); + uniqueCandidate = (commonType == null && returnType == factoryMethod.getReturnType() ? + factoryMethod : null); commonType = ClassUtils.determineCommonAncestor(returnType, commonType); if (commonType == null) { // Ambiguous return types found: return null to indicate "not determinable". @@ -752,12 +753,15 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac } } - if (commonType != null) { - // Clear return type found: all factory methods return same type. - mbd.factoryMethodReturnType = (uniqueCandidate != null ? - ResolvableType.forMethodReturnType(uniqueCandidate) : ResolvableType.forClass(commonType)); + if (commonType == null) { + return null; } - return commonType; + // Common return type found: all factory methods return same type. For a non-parameterized + // unique candidate, cache the full type declaration context of the target factory method. + cachedReturnType = (uniqueCandidate != null ? + ResolvableType.forMethodReturnType(uniqueCandidate) : ResolvableType.forClass(commonType)); + mbd.factoryMethodReturnType = cachedReturnType; + return cachedReturnType.resolve(); } /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java index b2177c70..90671851 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java @@ -109,6 +109,11 @@ public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanReg } else { if (object != null && shouldPostProcess) { + if (isSingletonCurrentlyInCreation(beanName)) { + // Temporarily return non-post-processed object, not storing it yet.. + return object; + } + beforeSingletonCreation(beanName); try { object = postProcessObjectFromFactoryBean(object, beanName); } @@ -116,6 +121,9 @@ public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanReg throw new BeanCreationException(beanName, "Post-processing of FactoryBean's singleton object failed", ex); } + finally { + afterSingletonCreation(beanName); + } } if (containsSingleton(beanName)) { this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT)); |