The Spring Framework

org.springframework.beans.factory.support
Class DefaultSingletonBeanRegistry

java.lang.Object
  extended by org.springframework.beans.factory.support.DefaultSingletonBeanRegistry
All Implemented Interfaces:
SingletonBeanRegistry
Direct Known Subclasses:
AbstractBeanFactory

public class DefaultSingletonBeanRegistry
extends Object
implements SingletonBeanRegistry

Generic registry for shared bean instances, implementing the 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 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 BeanFactory implementations, factoring out the common management of singleton bean instances. Note that the 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.

Since:
2.0
Author:
Juergen Hoeller
See Also:
registerSingleton(java.lang.String, java.lang.Object), registerDisposableBean(java.lang.String, org.springframework.beans.factory.DisposableBean), DisposableBean, ConfigurableBeanFactory

Field Summary
protected  Log logger
          Logger available to subclasses
 
Constructor Summary
DefaultSingletonBeanRegistry()
           
 
Method Summary
protected  void addSingleton(String beanName, Object singletonObject)
          Add the given singleton object to the singleton cache of this factory.
protected  void afterSingletonCreation(String beanName)
          Callback after singleton creation.
protected  void beforeSingletonCreation(String beanName)
          Callback before singleton creation.
 boolean containsSingleton(String beanName)
          Check if this registry contains a singleton instance with the given name.
protected  void destroyBean(String beanName, DisposableBean bean)
          Destroy the given bean.
 void destroySingleton(String beanName)
          Destroy the given bean.
 void destroySingletons()
           
protected  Set getDependentBeans(String beanName)
          Return the names of all beans which depend on the specified bean, if any.
 Object getSingleton(String beanName)
          Return the (raw) singleton object registered under the given name.
 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.
 int getSingletonCount()
          Return the number of singleton beans registered in this registry.
protected  Object getSingletonMutex()
          Expose the singleton mutex to subclasses.
 String[] getSingletonNames()
          Return the names of singleton beans registered in this registry.
protected  boolean hasDependentBean(String beanName)
          Return whether a dependent bean has been registered under the given name.
 boolean isSingletonCurrentlyInCreation(String beanName)
          Return whether the specified singleton bean is currently in creation (within the entire factory).
 void registerDependentBean(String beanName, String dependentBeanName)
          Register a dependent bean for the given bean, to be destroyed before the given bean is destroyed.
 void registerDisposableBean(String beanName, DisposableBean bean)
          Add the given bean to the list of disposable beans in this registry.
 void registerSingleton(String beanName, Object singletonObject)
          Register the given existing object as singleton in the bean registry, under the given bean name.
protected  void removeSingleton(String beanName)
          Remove the bean with the given name from the singleton cache of this factory.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

logger

protected final Log logger
Logger available to subclasses

Constructor Detail

DefaultSingletonBeanRegistry

public DefaultSingletonBeanRegistry()
Method Detail

registerSingleton

public void registerSingleton(String beanName,
                              Object singletonObject)
                       throws IllegalStateException
Description copied from interface: SingletonBeanRegistry
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.

If 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.

Specified by:
registerSingleton in interface SingletonBeanRegistry
Parameters:
beanName - the name of the bean
singletonObject - the existing singleton object
Throws:
IllegalStateException
See Also:
InitializingBean.afterPropertiesSet(), DisposableBean.destroy(), BeanDefinitionRegistry.registerBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition)

addSingleton

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, e.g. to be able to resolve circular references.

Parameters:
beanName - the name of the bean
singletonObject - the singleton object

getSingleton

public Object getSingleton(String beanName)
Description copied from interface: SingletonBeanRegistry
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 SingletonBeanRegistry.registerSingleton(java.lang.String, java.lang.Object)). Can also be used to access a singleton defined by a bean definition that already been created, in a raw fashion.

Specified by:
getSingleton in interface SingletonBeanRegistry
Parameters:
beanName - the name of the bean to look for
Returns:
the registered singleton object, or null if none found
See Also:
ConfigurableListableBeanFactory.getBeanDefinition(java.lang.String)

getSingleton

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 - the name of the bean
singletonFactory - the ObjectFactory to lazily create the singleton with, if necessary
Returns:
the registered singleton object

removeSingleton

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 - the name of the bean

containsSingleton

public boolean containsSingleton(String beanName)
Description copied from interface: SingletonBeanRegistry
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 SingletonBeanRegistry.registerSingleton(java.lang.String, java.lang.Object)). 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 an own bean 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.

Specified by:
containsSingleton in interface SingletonBeanRegistry
Parameters:
beanName - the name of the bean to look for
Returns:
if this bean factory contains a singleton instance with the given name
See Also:
SingletonBeanRegistry.registerSingleton(java.lang.String, java.lang.Object), ListableBeanFactory.containsBeanDefinition(java.lang.String), BeanFactory.containsBean(java.lang.String)

getSingletonNames

public String[] getSingletonNames()
Description copied from interface: SingletonBeanRegistry
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 SingletonBeanRegistry.registerSingleton(java.lang.String, java.lang.Object)). Can also be used to check which singletons defined by a bean definition have already been created.

Specified by:
getSingletonNames in interface SingletonBeanRegistry
Returns:
the list of names as String array (never null)
See Also:
SingletonBeanRegistry.registerSingleton(java.lang.String, java.lang.Object), BeanDefinitionRegistry.getBeanDefinitionNames(), ListableBeanFactory.getBeanDefinitionNames()

getSingletonCount

public int getSingletonCount()
Description copied from interface: SingletonBeanRegistry
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 SingletonBeanRegistry.registerSingleton(java.lang.String, java.lang.Object)). Can also be used to count the number of singletons defined by a bean definition that have already been created.

Specified by:
getSingletonCount in interface SingletonBeanRegistry
Returns:
the number of singleton beans
See Also:
SingletonBeanRegistry.registerSingleton(java.lang.String, java.lang.Object), BeanDefinitionRegistry.getBeanDefinitionCount(), ListableBeanFactory.getBeanDefinitionCount()

beforeSingletonCreation

protected void beforeSingletonCreation(String beanName)
Callback before singleton creation.

Default implementation register the singleton as currently in creation.

Parameters:
beanName - the name of the singleton about to be created
See Also:
isSingletonCurrentlyInCreation(java.lang.String)

afterSingletonCreation

protected void afterSingletonCreation(String beanName)
Callback after singleton creation.

Default implementation marks the singleton as not in creation anymore.

Parameters:
beanName - the name of the singleton that has been created
See Also:
isSingletonCurrentlyInCreation(java.lang.String)

isSingletonCurrentlyInCreation

public final boolean isSingletonCurrentlyInCreation(String beanName)
Return whether the specified singleton bean is currently in creation (within the entire factory).

Parameters:
beanName - the name of the bean

registerDisposableBean

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 - the name of the bean
bean - the bean instance

registerDependentBean

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 - the name of the bean
dependentBeanName - the name of the dependent bean

hasDependentBean

protected boolean hasDependentBean(String beanName)
Return whether a dependent bean has been registered under the given name.

Parameters:
beanName - the name of the bean

getDependentBeans

protected Set getDependentBeans(String beanName)
Return the names of all beans which depend on the specified bean, if any.

Parameters:
beanName - the name of the bean
Returns:
the array of dependent bean names, or an empty array if none

destroySingletons

public void destroySingletons()

destroySingleton

public void destroySingleton(String beanName)
Destroy the given bean. Delegates to destroyBean if a corresponding disposable bean instance is found.

Parameters:
beanName - the name of the bean
See Also:
destroyBean(java.lang.String, org.springframework.beans.factory.DisposableBean)

destroyBean

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 - the name of the bean
bean - the bean instance to destroy

getSingletonMutex

protected final Object getSingletonMutex()
Expose the singleton mutex to subclasses.

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.


The Spring Framework

Copyright © 2002-2007 The Spring Framework.