|
|
|
@ -130,7 +130,17 @@ public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanReg |
|
|
|
try { |
|
|
|
try { |
|
|
|
Object object = this.factoryBeanObjectCache.get(beanName); |
|
|
|
Object object = this.factoryBeanObjectCache.get(beanName); |
|
|
|
if (object == null) { |
|
|
|
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
|
|
|
|
// 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)
|
|
|
|
// (for example, because of circular reference processing triggered by custom getBean calls)
|
|
|
|
Object alreadyThere = this.factoryBeanObjectCache.get(beanName); |
|
|
|
Object alreadyThere = this.factoryBeanObjectCache.get(beanName); |
|
|
|
|