Class BeanFactoryUtils


  • public abstract class BeanFactoryUtils
    extends Object
    Convenience methods operating on bean factories, in particular on the ListableBeanFactory interface.

    Returns bean counts, bean names or bean instances, taking into account the nesting hierarchy of a bean factory (which the methods defined on the ListableBeanFactory interface don't, in contrast to the methods defined on the BeanFactory interface).

    Since:
    04.07.2003
    Author:
    Rod Johnson, Juergen Hoeller, Chris Beams
    • Method Detail

      • transformedBeanName

        public static String transformedBeanName​(String name)
        Return the actual bean name, stripping out the factory dereference prefix (if any, also stripping repeated factory prefixes if found).
        Parameters:
        name - the name of the bean
        Returns:
        the transformed name
        See Also:
        BeanFactory.FACTORY_BEAN_PREFIX
      • originalBeanName

        public static String originalBeanName​(String name)
        Extract the "raw" bean name from the given (potentially generated) bean name, excluding any "#..." suffixes which might have been added for uniqueness.
        Parameters:
        name - the potentially generated bean name
        Returns:
        the raw bean name
        See Also:
        GENERATED_BEAN_NAME_SEPARATOR
      • beanNamesForTypeIncludingAncestors

        public static String[] beanNamesForTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                                  ResolvableType type)
        Get all bean names for the given type, including those defined in ancestor factories. Will return unique names in case of overridden bean definitions.

        Does consider objects created by FactoryBeans, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type.

        This version of beanNamesForTypeIncludingAncestors automatically includes prototypes and FactoryBeans.

        Parameters:
        lbf - the bean factory
        type - the type that beans must match (as a ResolvableType)
        Returns:
        the array of matching bean names, or an empty array if none
        Since:
        4.2
        See Also:
        ListableBeanFactory.getBeanNamesForType(ResolvableType)
      • beanNamesForTypeIncludingAncestors

        public static String[] beanNamesForTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                                  ResolvableType type,
                                                                  boolean includeNonSingletons,
                                                                  boolean allowEagerInit)
        Get all bean names for the given type, including those defined in ancestor factories. Will return unique names in case of overridden bean definitions.

        Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked (which doesn't require initialization of each FactoryBean).

        Parameters:
        lbf - the bean factory
        type - the type that beans must match (as a ResolvableType)
        includeNonSingletons - whether to include prototype or scoped beans too or just singletons (also applies to FactoryBeans)
        allowEagerInit - whether to initialize lazy-init singletons and objects created by FactoryBeans (or by factory methods with a "factory-bean" reference) for the type check. Note that FactoryBeans need to be eagerly initialized to determine their type: So be aware that passing in "true" for this flag will initialize FactoryBeans and "factory-bean" references.
        Returns:
        the array of matching bean names, or an empty array if none
        Since:
        5.2
        See Also:
        ListableBeanFactory.getBeanNamesForType(ResolvableType, boolean, boolean)
      • beanNamesForTypeIncludingAncestors

        public static String[] beanNamesForTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                                  Class<?> type)
        Get all bean names for the given type, including those defined in ancestor factories. Will return unique names in case of overridden bean definitions.

        Does consider objects created by FactoryBeans, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type.

        This version of beanNamesForTypeIncludingAncestors automatically includes prototypes and FactoryBeans.

        Parameters:
        lbf - the bean factory
        type - the type that beans must match (as a Class)
        Returns:
        the array of matching bean names, or an empty array if none
        See Also:
        ListableBeanFactory.getBeanNamesForType(Class)
      • beanNamesForTypeIncludingAncestors

        public static String[] beanNamesForTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                                  Class<?> type,
                                                                  boolean includeNonSingletons,
                                                                  boolean allowEagerInit)
        Get all bean names for the given type, including those defined in ancestor factories. Will return unique names in case of overridden bean definitions.

        Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked (which doesn't require initialization of each FactoryBean).

        Parameters:
        lbf - the bean factory
        includeNonSingletons - whether to include prototype or scoped beans too or just singletons (also applies to FactoryBeans)
        allowEagerInit - whether to initialize lazy-init singletons and objects created by FactoryBeans (or by factory methods with a "factory-bean" reference) for the type check. Note that FactoryBeans need to be eagerly initialized to determine their type: So be aware that passing in "true" for this flag will initialize FactoryBeans and "factory-bean" references.
        type - the type that beans must match
        Returns:
        the array of matching bean names, or an empty array if none
        See Also:
        ListableBeanFactory.getBeanNamesForType(Class, boolean, boolean)
      • beansOfTypeIncludingAncestors

        public static <T> Map<String,​T> beansOfTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                                            Class<T> type)
                                                                     throws BeansException
        Return all beans of the given type or subtypes, also picking up beans defined in ancestor bean factories if the current bean factory is a HierarchicalBeanFactory. The returned Map will only contain beans of this type.

        Does consider objects created by FactoryBeans, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type.

        Note: Beans of the same name will take precedence at the 'lowest' factory level, i.e. such beans will be returned from the lowest factory that they are being found in, hiding corresponding beans in ancestor factories. This feature allows for 'replacing' beans by explicitly choosing the same bean name in a child factory; the bean in the ancestor factory won't be visible then, not even for by-type lookups.

        Parameters:
        lbf - the bean factory
        type - type of bean to match
        Returns:
        the Map of matching bean instances, or an empty Map if none
        Throws:
        BeansException - if a bean could not be created
        See Also:
        ListableBeanFactory.getBeansOfType(Class)
      • beansOfTypeIncludingAncestors

        public static <T> Map<String,​T> beansOfTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                                            Class<T> type,
                                                                            boolean includeNonSingletons,
                                                                            boolean allowEagerInit)
                                                                     throws BeansException
        Return all beans of the given type or subtypes, also picking up beans defined in ancestor bean factories if the current bean factory is a HierarchicalBeanFactory. The returned Map will only contain beans of this type.

        Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked (which doesn't require initialization of each FactoryBean).

        Note: Beans of the same name will take precedence at the 'lowest' factory level, i.e. such beans will be returned from the lowest factory that they are being found in, hiding corresponding beans in ancestor factories. This feature allows for 'replacing' beans by explicitly choosing the same bean name in a child factory; the bean in the ancestor factory won't be visible then, not even for by-type lookups.

        Parameters:
        lbf - the bean factory
        type - type of bean to match
        includeNonSingletons - whether to include prototype or scoped beans too or just singletons (also applies to FactoryBeans)
        allowEagerInit - whether to initialize lazy-init singletons and objects created by FactoryBeans (or by factory methods with a "factory-bean" reference) for the type check. Note that FactoryBeans need to be eagerly initialized to determine their type: So be aware that passing in "true" for this flag will initialize FactoryBeans and "factory-bean" references.
        Returns:
        the Map of matching bean instances, or an empty Map if none
        Throws:
        BeansException - if a bean could not be created
        See Also:
        ListableBeanFactory.getBeansOfType(Class, boolean, boolean)
      • beanOfTypeIncludingAncestors

        public static <T> T beanOfTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                         Class<T> type)
                                                  throws BeansException
        Return a single bean of the given type or subtypes, also picking up beans defined in ancestor bean factories if the current bean factory is a HierarchicalBeanFactory. Useful convenience method when we expect a single bean and don't care about the bean name.

        Does consider objects created by FactoryBeans, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type.

        This version of beanOfTypeIncludingAncestors automatically includes prototypes and FactoryBeans.

        Note: Beans of the same name will take precedence at the 'lowest' factory level, i.e. such beans will be returned from the lowest factory that they are being found in, hiding corresponding beans in ancestor factories. This feature allows for 'replacing' beans by explicitly choosing the same bean name in a child factory; the bean in the ancestor factory won't be visible then, not even for by-type lookups.

        Parameters:
        lbf - the bean factory
        type - type of bean to match
        Returns:
        the matching bean instance
        Throws:
        NoSuchBeanDefinitionException - if no bean of the given type was found
        NoUniqueBeanDefinitionException - if more than one bean of the given type was found
        BeansException - if the bean could not be created
        See Also:
        beansOfTypeIncludingAncestors(ListableBeanFactory, Class)
      • beanOfTypeIncludingAncestors

        public static <T> T beanOfTypeIncludingAncestors​(ListableBeanFactory lbf,
                                                         Class<T> type,
                                                         boolean includeNonSingletons,
                                                         boolean allowEagerInit)
                                                  throws BeansException
        Return a single bean of the given type or subtypes, also picking up beans defined in ancestor bean factories if the current bean factory is a HierarchicalBeanFactory. Useful convenience method when we expect a single bean and don't care about the bean name.

        Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked (which doesn't require initialization of each FactoryBean).

        Note: Beans of the same name will take precedence at the 'lowest' factory level, i.e. such beans will be returned from the lowest factory that they are being found in, hiding corresponding beans in ancestor factories. This feature allows for 'replacing' beans by explicitly choosing the same bean name in a child factory; the bean in the ancestor factory won't be visible then, not even for by-type lookups.

        Parameters:
        lbf - the bean factory
        type - type of bean to match
        includeNonSingletons - whether to include prototype or scoped beans too or just singletons (also applies to FactoryBeans)
        allowEagerInit - whether to initialize lazy-init singletons and objects created by FactoryBeans (or by factory methods with a "factory-bean" reference) for the type check. Note that FactoryBeans need to be eagerly initialized to determine their type: So be aware that passing in "true" for this flag will initialize FactoryBeans and "factory-bean" references.
        Returns:
        the matching bean instance
        Throws:
        NoSuchBeanDefinitionException - if no bean of the given type was found
        NoUniqueBeanDefinitionException - if more than one bean of the given type was found
        BeansException - if the bean could not be created
        See Also:
        beansOfTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean)
      • beanOfType

        public static <T> T beanOfType​(ListableBeanFactory lbf,
                                       Class<T> type)
                                throws BeansException
        Return a single bean of the given type or subtypes, not looking in ancestor factories. Useful convenience method when we expect a single bean and don't care about the bean name.

        Does consider objects created by FactoryBeans, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type.

        This version of beanOfType automatically includes prototypes and FactoryBeans.

        Parameters:
        lbf - the bean factory
        type - type of bean to match
        Returns:
        the matching bean instance
        Throws:
        NoSuchBeanDefinitionException - if no bean of the given type was found
        NoUniqueBeanDefinitionException - if more than one bean of the given type was found
        BeansException - if the bean could not be created
        See Also:
        ListableBeanFactory.getBeansOfType(Class)
      • beanOfType

        public static <T> T beanOfType​(ListableBeanFactory lbf,
                                       Class<T> type,
                                       boolean includeNonSingletons,
                                       boolean allowEagerInit)
                                throws BeansException
        Return a single bean of the given type or subtypes, not looking in ancestor factories. Useful convenience method when we expect a single bean and don't care about the bean name.

        Does consider objects created by FactoryBeans if the "allowEagerInit" flag is set, which means that FactoryBeans will get initialized. If the object created by the FactoryBean doesn't match, the raw FactoryBean itself will be matched against the type. If "allowEagerInit" is not set, only raw FactoryBeans will be checked (which doesn't require initialization of each FactoryBean).

        Parameters:
        lbf - the bean factory
        type - type of bean to match
        includeNonSingletons - whether to include prototype or scoped beans too or just singletons (also applies to FactoryBeans)
        allowEagerInit - whether to initialize lazy-init singletons and objects created by FactoryBeans (or by factory methods with a "factory-bean" reference) for the type check. Note that FactoryBeans need to be eagerly initialized to determine their type: So be aware that passing in "true" for this flag will initialize FactoryBeans and "factory-bean" references.
        Returns:
        the matching bean instance
        Throws:
        NoSuchBeanDefinitionException - if no bean of the given type was found
        NoUniqueBeanDefinitionException - if more than one bean of the given type was found
        BeansException - if the bean could not be created
        See Also:
        ListableBeanFactory.getBeansOfType(Class, boolean, boolean)