Browse Source

Fall back to local synchronization in getObjectFromFactoryBean

Closes gh-35545
pull/35587/head
Juergen Hoeller 3 months ago
parent
commit
74dc61b8c4
  1. 12
      spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java

12
spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java

@ -130,7 +130,17 @@ public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanReg @@ -130,7 +130,17 @@ public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanReg
try {
Object object = this.factoryBeanObjectCache.get(beanName);
if (object == null) {
object = doGetObjectFromFactoryBean(factory, beanName);
if (locked) {
// The common case: within general singleton lock.
object = doGetObjectFromFactoryBean(factory, beanName);
}
else {
// Fall back to local synchronization on the given FactoryBean instance,
// as a defensive measure for non-thread-safe FactoryBean implementations.
synchronized (factory) {
object = doGetObjectFromFactoryBean(factory, beanName);
}
}
// Only post-process and store if not put there already during getObject() call above
// (for example, because of circular reference processing triggered by custom getBean calls)
Object alreadyThere = this.factoryBeanObjectCache.get(beanName);

Loading…
Cancel
Save