Top Description Fields Constructors Methods
org.springframework.beans.factory.support

public Class DefaultSingletonBeanRegistry

extends SimpleAliasRegistry
implements SingletonBeanRegistry
Class Inheritance
All Implemented Interfaces
org.springframework.beans.factory.config.SingletonBeanRegistry
Known Direct Subclasses
org.springframework.beans.factory.support.FactoryBeanRegistrySupport
Imports
java.util.Collections, .HashMap, .HashSet, .Iterator, .LinkedHashMap, .LinkedHashSet, .Map, .Set, java.util.concurrent.ConcurrentHashMap, org.springframework.beans.factory.BeanCreationException, .BeanCreationNotAllowedException, .BeanCurrentlyInCreationException, .DisposableBean, .ObjectFactory, org.springframework.beans.factory.config.SingletonBeanRegistry, org.springframework.core.SimpleAliasRegistry, org.springframework.lang.Nullable, org.springframework.util.Assert, .StringUtils

Generic registry for shared bean instances, implementing the org.springframework.beans.factory.config.SingletonBeanRegistry. Allows for registering singleton instances that should be shared for all callers of the registry, to be obtained via bean name.

Also supports registration of org.springframework.beans.factory.DisposableBean instances, (which might or might not correspond to registered singletons), to be destroyed on shutdown of the registry. Dependencies between beans can be registered to enforce an appropriate shutdown order.

This class mainly serves as base class for org.springframework.beans.factory.BeanFactory implementations, factoring out the common management of singleton bean instances. Note that the org.springframework.beans.factory.config.ConfigurableBeanFactory interface extends the SingletonBeanRegistry interface.

Note that this class assumes neither a bean definition concept nor a specific creation process for bean instances, in contrast to AbstractBeanFactory and DefaultListableBeanFactory (which inherit from it). Can alternatively also be used as a nested helper to delegate to.

Author
Juergen Hoeller
Since
2.0
See Also
registerSingleton, registerDisposableBean, org.springframework.beans.factory.DisposableBean, org.springframework.beans.factory.config.ConfigurableBeanFactory

Field Summary

Modifier and TypeField and Description
private final Map<String, Set<String>>
containedBeanMap

Map between containing bean names: bean name to Set of bean names that the bean contains.

private final Map<String, Set<String>>
dependenciesForBeanMap

Map between depending bean names: bean name to Set of bean names for the bean's dependencies.

private final Map<String, Set<String>>
dependentBeanMap

Map between dependent bean names: bean name to Set of dependent bean names.

private final Map<String, DisposableBean>
disposableBeans

Disposable bean instances: bean name to disposable instance.

private final Map<String, Object>
earlySingletonObjects

Cache of early singleton objects: bean name to bean instance.

private final Set<String>
inCreationCheckExclusions

Names of beans currently excluded from in creation checks.

private final Set<String>
registeredSingletons

Set of registered singletons, containing the bean names in registration order.

private final Map<String, ObjectFactory<?>>
singletonFactories

Cache of singleton factories: bean name to ObjectFactory.

private final Map<String, Object>
singletonObjects

Cache of singleton objects: bean name to bean instance.

private final Set<String>
singletonsCurrentlyInCreation

Names of beans that are currently in creation.

private boolean
singletonsCurrentlyInDestruction

Flag that indicates whether we're currently within destroySingletons.

private static final int
SUPPRESSED_EXCEPTIONS_LIMIT

Maximum number of suppressed exceptions to preserve.

private Set<Exception>
suppressedExceptions

Collection of suppressed Exceptions, available for associating related causes.

Inherited from org.springframework.core.SimpleAliasRegistry:
logger

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
protected void
addSingleton(String
the name of the bean
beanName
,
Object
the singleton object
singletonObject
)

Add the given singleton object to the singleton cache of this factory.

protected void
addSingletonFactory(String
the name of the bean
beanName
,
ObjectFactory<?>
the factory for the singleton object
singletonFactory
)

Add the given singleton factory for building the specified singleton if necessary.

protected void
afterSingletonCreation(String
the name of the singleton that has been created
beanName
)

Callback after singleton creation.

protected void
beforeSingletonCreation(String
the name of the singleton about to be created
beanName
)

Callback before singleton creation.

protected void
clearSingletonCache()

Clear all cached singleton instances in this registry.

public boolean
containsSingleton(String
the name of the bean to look for
beanName
)

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.containsSingleton.

Check if this registry contains a singleton instance with the given name.
protected void
destroyBean(String
the name of the bean
beanName
,
DisposableBean
the bean instance to destroy
bean
)

Destroy the given bean.

public void
destroySingleton(String
the name of the bean
beanName
)

Destroy the given bean.

public void
public String[]

Returns:

the array of names of beans which the bean depends on, or an empty array if none
getDependenciesForBean
(String
the name of the bean
beanName
)

Return the names of all beans that the specified bean depends on, if any.

public String[]

Returns:

the array of dependent bean names, or an empty array if none
getDependentBeans
(String
the name of the bean
beanName
)

Return the names of all beans which depend on the specified bean, if any.

public Object
getSingleton(String
the name of the bean to look for
beanName
)

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingleton.

Return the (raw) singleton object registered under the given name.
protected Object

Returns:

the registered singleton object, or null if none found
getSingleton
(String
the name of the bean to look for
beanName
,
boolean
whether early references should be created or not
allowEarlyReference
)

Return the (raw) singleton object registered under the given name.

public Object

Returns:

the registered singleton object
getSingleton
(String
the name of the bean
beanName
,
ObjectFactory<?>
the ObjectFactory to lazily create the singleton with, if necessary
singletonFactory
)

Return the (raw) singleton object registered under the given name, creating and registering a new one if none registered yet.

public int
getSingletonCount()

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonCount.

Return the number of singleton beans registered in this registry.
public final Object
getSingletonMutex()

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonMutex.

Exposes the singleton mutex to subclasses and external collaborators.
public String[]
getSingletonNames()

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonNames.

Return the names of singleton beans registered in this registry.
protected boolean
hasDependentBean(String
the name of the bean to check
beanName
)

Determine whether a dependent bean has been registered for the given name.

protected boolean
public boolean
protected boolean
isDependent(String
the name of the bean to check
beanName
,
String
the name of the dependent bean
dependentBeanName
)

Determine whether the specified dependent bean has been registered as dependent on the given bean or on any of its transitive dependencies.

private boolean
isDependent(String beanName, String dependentBeanName, Set<String> alreadySeen)

public boolean
isSingletonCurrentlyInCreation(String
the name of the bean
beanName
)

Return whether the specified singleton bean is currently in creation (within the entire factory).

protected void
onSuppressedException(Exception
the Exception to register
ex
)

Register an exception that happened to get suppressed during the creation of a singleton bean instance, e.g. a temporary circular reference resolution problem.

public void
registerContainedBean(String
the name of the contained (inner) bean
containedBeanName
,
String
the name of the containing (outer) bean
containingBeanName
)

Register a containment relationship between two beans, e.g. between an inner bean and its containing outer bean.

public void
registerDependentBean(String
the name of the bean
beanName
,
String
the name of the dependent bean
dependentBeanName
)

Register a dependent bean for the given bean, to be destroyed before the given bean is destroyed.

public void
registerDisposableBean(String
the name of the bean
beanName
,
DisposableBean
the bean instance
bean
)

Add the given bean to the list of disposable beans in this registry.

public void
registerSingleton(String
the name of the bean
beanName
,
Object
the existing singleton object
singletonObject
)

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.registerSingleton.

Register the given existing object as singleton in the bean registry, under the given bean name.
protected void
removeSingleton(String
the name of the bean
beanName
)

Remove the bean with the given name from the singleton cache of this factory, to be able to clean up eager registration of a singleton if creation failed.

public void
setCurrentlyInCreation(String beanName, boolean inCreation)

Inherited from org.springframework.core.SimpleAliasRegistry:
allowAliasOverridingcanonicalNamecheckForAliasCirclegetAliaseshasAliasisAliasregisterAliasremoveAliasresolveAliases

Field Detail

containedBeanMapback to summary
private final Map<String, Set<String>> containedBeanMap

Map between containing bean names: bean name to Set of bean names that the bean contains.

dependenciesForBeanMapback to summary
private final Map<String, Set<String>> dependenciesForBeanMap

Map between depending bean names: bean name to Set of bean names for the bean's dependencies.

dependentBeanMapback to summary
private final Map<String, Set<String>> dependentBeanMap

Map between dependent bean names: bean name to Set of dependent bean names.

disposableBeansback to summary
private final Map<String, DisposableBean> disposableBeans

Disposable bean instances: bean name to disposable instance.

earlySingletonObjectsback to summary
private final Map<String, Object> earlySingletonObjects

Cache of early singleton objects: bean name to bean instance.

inCreationCheckExclusionsback to summary
private final Set<String> inCreationCheckExclusions

Names of beans currently excluded from in creation checks.

registeredSingletonsback to summary
private final Set<String> registeredSingletons

Set of registered singletons, containing the bean names in registration order.

singletonFactoriesback to summary
private final Map<String, ObjectFactory<?>> singletonFactories

Cache of singleton factories: bean name to ObjectFactory.

singletonObjectsback to summary
private final Map<String, Object> singletonObjects

Cache of singleton objects: bean name to bean instance.

singletonsCurrentlyInCreationback to summary
private final Set<String> singletonsCurrentlyInCreation

Names of beans that are currently in creation.

singletonsCurrentlyInDestructionback to summary
private boolean singletonsCurrentlyInDestruction

Flag that indicates whether we're currently within destroySingletons.

SUPPRESSED_EXCEPTIONS_LIMITback to summary
private static final int SUPPRESSED_EXCEPTIONS_LIMIT

Maximum number of suppressed exceptions to preserve.

suppressedExceptionsback to summary
private Set<Exception> suppressedExceptions

Collection of suppressed Exceptions, available for associating related causes.

Annotations
@Nullable

Constructor Detail

DefaultSingletonBeanRegistryback to summary
public DefaultSingletonBeanRegistry()

Method Detail

addSingletonback to summary
protected void addSingleton(String beanName, Object singletonObject)

Add the given singleton object to the singleton cache of this factory.

To be called for eager registration of singletons.

Parameters
beanName:String

the name of the bean

singletonObject:Object

the singleton object

addSingletonFactoryback to summary
protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory)

Add the given singleton factory for building the specified singleton if necessary.

To be called for eager registration of singletons, e.g. to be able to resolve circular references.

Parameters
beanName:String

the name of the bean

singletonFactory:ObjectFactory<?>

the factory for the singleton object

afterSingletonCreationback to summary
protected void afterSingletonCreation(String beanName)

Callback after singleton creation.

The default implementation marks the singleton as not in creation anymore.

Parameters
beanName:String

the name of the singleton that has been created

See Also
isSingletonCurrentlyInCreation
beforeSingletonCreationback to summary
protected void beforeSingletonCreation(String beanName)

Callback before singleton creation.

The default implementation register the singleton as currently in creation.

Parameters
beanName:String

the name of the singleton about to be created

See Also
isSingletonCurrentlyInCreation
clearSingletonCacheback to summary
protected void clearSingletonCache()

Clear all cached singleton instances in this registry.

Since
4.3.15
containsSingletonback to summary
public boolean containsSingleton(String beanName)

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.containsSingleton.

Doc from org.springframework.beans.factory.config.SingletonBeanRegistry.containsSingleton.

Check if this registry contains a singleton instance with the given name.

Only checks already instantiated singletons; does not return true for singleton bean definitions which have not been instantiated yet.

The main purpose of this method is to check manually registered singletons (see registerSingleton). Can also be used to check whether a singleton defined by a bean definition has already been created.

To check whether a bean factory contains a bean definition with a given name, use ListableBeanFactory's containsBeanDefinition. Calling both containsBeanDefinition and containsSingleton answers whether a specific bean factory contains a local bean instance with the given name.

Use BeanFactory's containsBean for general checks whether the factory knows about a bean with a given name (whether manually registered singleton instance or created by bean definition), also checking ancestor factories.

Note

This lookup method is not aware of FactoryBean prefixes or aliases. You need to resolve the canonical bean name first before checking the singleton status.

Parameters
beanName:String

the name of the bean to look for

Returns:boolean

if this bean factory contains a singleton instance with the given name

Annotations
@Override
destroyBeanback to summary
protected void destroyBean(String beanName, DisposableBean bean)

Destroy the given bean. Must destroy beans that depend on the given bean before the bean itself. Should not throw any exceptions.

Parameters
beanName:String

the name of the bean

bean:DisposableBean

the bean instance to destroy

destroySingletonback to summary
public void destroySingleton(String beanName)

Destroy the given bean. Delegates to destroyBean if a corresponding disposable bean instance is found.

Parameters
beanName:String

the name of the bean

See Also
destroyBean
destroySingletonsback to summary
public void destroySingletons()
getDependenciesForBeanback to summary
public String[] getDependenciesForBean(String beanName)

Return the names of all beans that the specified bean depends on, if any.

Parameters
beanName:String

the name of the bean

Returns:String[]

the array of names of beans which the bean depends on, or an empty array if none

getDependentBeansback to summary
public String[] getDependentBeans(String beanName)

Return the names of all beans which depend on the specified bean, if any.

Parameters
beanName:String

the name of the bean

Returns:String[]

the array of dependent bean names, or an empty array if none

getSingletonback to summary
public Object getSingleton(String beanName)

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingleton.

Doc from org.springframework.beans.factory.config.SingletonBeanRegistry.getSingleton.

Return the (raw) singleton object registered under the given name.

Only checks already instantiated singletons; does not return an Object for singleton bean definitions which have not been instantiated yet.

The main purpose of this method is to access manually registered singletons (see registerSingleton). Can also be used to access a singleton defined by a bean definition that already been created, in a raw fashion.

Note

This lookup method is not aware of FactoryBean prefixes or aliases. You need to resolve the canonical bean name first before obtaining the singleton instance.

Parameters
beanName:String

the name of the bean to look for

Returns:Object

the registered singleton object, or null if none found

Annotations
@Override
@Nullable
getSingletonback to summary
protected Object getSingleton(String beanName, boolean allowEarlyReference)

Return the (raw) singleton object registered under the given name.

Checks already instantiated singletons and also allows for an early reference to a currently created singleton (resolving a circular reference).

Parameters
beanName:String

the name of the bean to look for

allowEarlyReference:boolean

whether early references should be created or not

Returns:Object

the registered singleton object, or null if none found

Annotations
@Nullable
getSingletonback to summary
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory)

Return the (raw) singleton object registered under the given name, creating and registering a new one if none registered yet.

Parameters
beanName:String

the name of the bean

singletonFactory:ObjectFactory<?>

the ObjectFactory to lazily create the singleton with, if necessary

Returns:Object

the registered singleton object

getSingletonCountback to summary
public int getSingletonCount()

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonCount.

Doc from org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonCount.

Return the number of singleton beans registered in this registry.

Only checks already instantiated singletons; does not count singleton bean definitions which have not been instantiated yet.

The main purpose of this method is to check manually registered singletons (see registerSingleton). Can also be used to count the number of singletons defined by a bean definition that have already been created.

Returns:int

the number of singleton beans

Annotations
@Override
getSingletonMutexback to summary
public final Object getSingletonMutex()

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonMutex.

Exposes the singleton mutex to subclasses and external collaborators.

Subclasses should synchronize on the given Object if they perform any sort of extended singleton creation phase. In particular, subclasses should not have their own mutexes involved in singleton creation, to avoid the potential for deadlocks in lazy-init situations.

Returns:Object

Doc from org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonMutex.

the mutex object (never null)

Annotations
@Override
getSingletonNamesback to summary
public String[] getSingletonNames()

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonNames.

Doc from org.springframework.beans.factory.config.SingletonBeanRegistry.getSingletonNames.

Return the names of singleton beans registered in this registry.

Only checks already instantiated singletons; does not return names for singleton bean definitions which have not been instantiated yet.

The main purpose of this method is to check manually registered singletons (see registerSingleton). Can also be used to check which singletons defined by a bean definition have already been created.

Returns:String[]

the list of names as a String array (never null)

Annotations
@Override
hasDependentBeanback to summary
protected boolean hasDependentBean(String beanName)

Determine whether a dependent bean has been registered for the given name.

Parameters
beanName:String

the name of the bean to check

isActuallyInCreationback to summary
protected boolean isActuallyInCreation(String beanName)
isCurrentlyInCreationback to summary
public boolean isCurrentlyInCreation(String beanName)
isDependentback to summary
protected boolean isDependent(String beanName, String dependentBeanName)

Determine whether the specified dependent bean has been registered as dependent on the given bean or on any of its transitive dependencies.

Parameters
beanName:String

the name of the bean to check

dependentBeanName:String

the name of the dependent bean

Since
4.0
isDependentback to summary
private boolean isDependent(String beanName, String dependentBeanName, Set<String> alreadySeen)
isSingletonCurrentlyInCreationback to summary
public boolean isSingletonCurrentlyInCreation(String beanName)

Return whether the specified singleton bean is currently in creation (within the entire factory).

Parameters
beanName:String

the name of the bean

onSuppressedExceptionback to summary
protected void onSuppressedException(Exception ex)

Register an exception that happened to get suppressed during the creation of a singleton bean instance, e.g. a temporary circular reference resolution problem.

The default implementation preserves any given exception in this registry's collection of suppressed exceptions, up to a limit of 100 exceptions, adding them as related causes to an eventual top-level BeanCreationException.

Parameters
ex:Exception

the Exception to register

See Also
BeanCreationException#getRelatedCauses()
registerContainedBeanback to summary
public void registerContainedBean(String containedBeanName, String containingBeanName)

Register a containment relationship between two beans, e.g. between an inner bean and its containing outer bean.

Also registers the containing bean as dependent on the contained bean in terms of destruction order.

Parameters
containedBeanName:String

the name of the contained (inner) bean

containingBeanName:String

the name of the containing (outer) bean

See Also
registerDependentBean
registerDependentBeanback to summary
public void registerDependentBean(String beanName, String dependentBeanName)

Register a dependent bean for the given bean, to be destroyed before the given bean is destroyed.

Parameters
beanName:String

the name of the bean

dependentBeanName:String

the name of the dependent bean

registerDisposableBeanback to summary
public void registerDisposableBean(String beanName, DisposableBean bean)

Add the given bean to the list of disposable beans in this registry.

Disposable beans usually correspond to registered singletons, matching the bean name but potentially being a different instance (for example, a DisposableBean adapter for a singleton that does not naturally implement Spring's DisposableBean interface).

Parameters
beanName:String

the name of the bean

bean:DisposableBean

the bean instance

registerSingletonback to summary
public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException

Implements org.springframework.beans.factory.config.SingletonBeanRegistry.registerSingleton.

Doc from org.springframework.beans.factory.config.SingletonBeanRegistry.registerSingleton.

Register the given existing object as singleton in the bean registry, under the given bean name.

The given instance is supposed to be fully initialized; the registry will not perform any initialization callbacks (in particular, it won't call InitializingBean's afterPropertiesSet method). The given instance will not receive any destruction callbacks (like DisposableBean's destroy method) either.

When running within a full BeanFactory: Register a bean definition instead of an existing instance if your bean is supposed to receive initialization and/or destruction callbacks.

Typically invoked during registry configuration, but can also be used for runtime registration of singletons. As a consequence, a registry implementation should synchronize singleton access; it will have to do this anyway if it supports a BeanFactory's lazy initialization of singletons.

Parameters
beanName:String

the name of the bean

singletonObject:Object

the existing singleton object

Annotations
@Override
removeSingletonback to summary
protected void removeSingleton(String beanName)

Remove the bean with the given name from the singleton cache of this factory, to be able to clean up eager registration of a singleton if creation failed.

Parameters
beanName:String

the name of the bean

See Also
getSingletonMutex()
setCurrentlyInCreationback to summary
public void setCurrentlyInCreation(String beanName, boolean inCreation)