org.springframework.beans.factory.support

Class DefaultSingletonBeanRegistry

    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method and Description
      protected void addSingleton(java.lang.String beanName, java.lang.Object singletonObject)
      Add the given singleton object to the singleton cache of this factory.
      protected void addSingletonFactory(java.lang.String beanName, ObjectFactory<?> singletonFactory)
      Add the given singleton factory for building the specified singleton if necessary.
      protected void afterSingletonCreation(java.lang.String beanName)
      Callback after singleton creation.
      protected void beforeSingletonCreation(java.lang.String beanName)
      Callback before singleton creation.
      protected void clearSingletonCache()
      Clear all cached singleton instances in this registry.
      boolean containsSingleton(java.lang.String beanName)
      Check if this registry contains a singleton instance with the given name.
      protected void destroyBean(java.lang.String beanName, DisposableBean bean)
      Destroy the given bean.
      void destroySingleton(java.lang.String beanName)
      Destroy the given bean.
      void destroySingletons() 
      java.lang.String[] getDependenciesForBean(java.lang.String beanName)
      Return the names of all beans that the specified bean depends on, if any.
      java.lang.String[] getDependentBeans(java.lang.String beanName)
      Return the names of all beans which depend on the specified bean, if any.
      java.lang.Object getSingleton(java.lang.String beanName)
      Return the (raw) singleton object registered under the given name.
      protected java.lang.Object getSingleton(java.lang.String beanName, boolean allowEarlyReference)
      Return the (raw) singleton object registered under the given name.
      java.lang.Object getSingleton(java.lang.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.
      java.lang.Object getSingletonMutex()
      Exposes the singleton mutex to subclasses and external collaborators.
      java.lang.String[] getSingletonNames()
      Return the names of singleton beans registered in this registry.
      protected boolean hasDependentBean(java.lang.String beanName)
      Determine whether a dependent bean has been registered for the given name.
      protected boolean isActuallyInCreation(java.lang.String beanName) 
      boolean isCurrentlyInCreation(java.lang.String beanName) 
      protected boolean isDependent(java.lang.String beanName, java.lang.String dependentBeanName)
      Determine whether the specified dependent bean has been registered as dependent on the given bean or on any of its transitive dependencies.
      boolean isSingletonCurrentlyInCreation(java.lang.String beanName)
      Return whether the specified singleton bean is currently in creation (within the entire factory).
      protected void onSuppressedException(java.lang.Exception ex)
      Register an Exception that happened to get suppressed during the creation of a singleton bean instance, e.g.
      void registerContainedBean(java.lang.String containedBeanName, java.lang.String containingBeanName)
      Register a containment relationship between two beans, e.g.
      void registerDependentBean(java.lang.String beanName, java.lang.String dependentBeanName)
      Register a dependent bean for the given bean, to be destroyed before the given bean is destroyed.
      void registerDisposableBean(java.lang.String beanName, DisposableBean bean)
      Add the given bean to the list of disposable beans in this registry.
      void registerSingleton(java.lang.String beanName, java.lang.Object singletonObject)
      Register the given existing object as singleton in the bean registry, under the given bean name.
      protected void removeSingleton(java.lang.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.
      void setCurrentlyInCreation(java.lang.String beanName, boolean inCreation) 
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • DefaultSingletonBeanRegistry

        public DefaultSingletonBeanRegistry()
    • Method Detail

      • registerSingleton

        public void registerSingleton(java.lang.String beanName,
                                      java.lang.Object singletonObject)
                               throws java.lang.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.

        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.

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

        protected void addSingleton(java.lang.String beanName,
                                    java.lang.Object singletonObject)
        Add the given singleton object to the singleton cache of this factory.

        To be called for eager registration of singletons.

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

        protected void addSingletonFactory(java.lang.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 - the name of the bean
        singletonFactory - the factory for the singleton object
      • getSingleton

        @Nullable
        public java.lang.Object getSingleton(java.lang.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.

        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.

        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

        @Nullable
        protected java.lang.Object getSingleton(java.lang.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 - the name of the bean to look for
        allowEarlyReference - whether early references should be created or not
        Returns:
        the registered singleton object, or null if none found
      • getSingleton

        public java.lang.Object getSingleton(java.lang.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
      • onSuppressedException

        protected void onSuppressedException(java.lang.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.
        Parameters:
        ex - the Exception to register
      • removeSingleton

        protected void removeSingleton(java.lang.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
        See Also:
        getSingletonMutex()
      • containsSingleton

        public boolean containsSingleton(java.lang.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 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.

        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)
      • setCurrentlyInCreation

        public void setCurrentlyInCreation(java.lang.String beanName,
                                           boolean inCreation)
      • isCurrentlyInCreation

        public boolean isCurrentlyInCreation(java.lang.String beanName)
      • isActuallyInCreation

        protected boolean isActuallyInCreation(java.lang.String beanName)
      • isSingletonCurrentlyInCreation

        public boolean isSingletonCurrentlyInCreation(java.lang.String beanName)
        Return whether the specified singleton bean is currently in creation (within the entire factory).
        Parameters:
        beanName - the name of the bean
      • beforeSingletonCreation

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

        The 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(java.lang.String beanName)
        Callback after singleton creation.

        The 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)
      • registerDisposableBean

        public void registerDisposableBean(java.lang.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
      • registerContainedBean

        public void registerContainedBean(java.lang.String containedBeanName,
                                          java.lang.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 - the name of the contained (inner) bean
        containingBeanName - the name of the containing (outer) bean
        See Also:
        registerDependentBean(java.lang.String, java.lang.String)
      • registerDependentBean

        public void registerDependentBean(java.lang.String beanName,
                                          java.lang.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
      • isDependent

        protected boolean isDependent(java.lang.String beanName,
                                      java.lang.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 - the name of the bean to check
        dependentBeanName - the name of the dependent bean
        Since:
        4.0
      • hasDependentBean

        protected boolean hasDependentBean(java.lang.String beanName)
        Determine whether a dependent bean has been registered for the given name.
        Parameters:
        beanName - the name of the bean to check
      • getDependentBeans

        public java.lang.String[] getDependentBeans(java.lang.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
      • getDependenciesForBean

        public java.lang.String[] getDependenciesForBean(java.lang.String beanName)
        Return the names of all beans that the specified bean depends on, if any.
        Parameters:
        beanName - the name of the bean
        Returns:
        the array of names of beans which the bean depends on, or an empty array if none
      • destroySingletons

        public void destroySingletons()
      • clearSingletonCache

        protected void clearSingletonCache()
        Clear all cached singleton instances in this registry.
        Since:
        4.3.15
      • destroyBean

        protected void destroyBean(java.lang.String beanName,
                                   @Nullable
                                   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

        public final java.lang.Object 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.

        Specified by:
        getSingletonMutex in interface SingletonBeanRegistry
        Returns:
        the mutex object (never null)