summaryrefslogtreecommitdiff
path: root/spring-beans/src/main/java/org/springframework/beans/factory/support
diff options
context:
space:
mode:
authorEmmanuel Bourg <ebourg@apache.org>2018-10-05 14:12:14 +0200
committerEmmanuel Bourg <ebourg@apache.org>2018-10-05 14:12:14 +0200
commit9a51aaff31d1c71a81ef349649af0de0bcbab3ff (patch)
tree7c7ac18ef2d5ce701da23f73b58e6b3e680b00a9 /spring-beans/src/main/java/org/springframework/beans/factory/support
parenteb01d39c7dba3fcf60cddec0ac62cc633abe9b53 (diff)
New upstream version 4.3.17
Diffstat (limited to 'spring-beans/src/main/java/org/springframework/beans/factory/support')
-rw-r--r--spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java16
-rw-r--r--spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java8
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));