org.springframework.beans.factory.support
Class AbstractAutowireCapableBeanFactory

java.lang.Object
  extended byorg.springframework.beans.factory.support.AbstractBeanFactory
      extended byorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
All Implemented Interfaces:
AutowireCapableBeanFactory, BeanFactory, ConfigurableBeanFactory, HierarchicalBeanFactory
Direct Known Subclasses:
DefaultListableBeanFactory

public abstract class AbstractAutowireCapableBeanFactory
extends AbstractBeanFactory
implements AutowireCapableBeanFactory

Abstract bean factory superclass that implements default bean creation, with the full capabilities specified by the RootBeanDefinition class. Implements the AutowireCapableBeanFactory interface. Like the base class AbstractBeanFactory, this superclass does not assume a listable bean factory.

Provides bean creation (with constructor resolution), property population, wiring (including autowiring), and initialization. Handles runtime bean references, resolves managed collections, calls initialization methods, etc. Supports autowiring constructors, properties by name, and properties by type.

The main template method to be implemented by subclasses is findMatchingBeansNote that this class does not assume or implement bean definition registry capabilities. See DefaultListableBeanFactory for an implementation of the ListableBeanFactory and BeanDefinitionRegistry interfaces, which represent the API respectively SPI view on such a factory.

Since:
13.02.2004
Author:
Rod Johnson, Juergen Hoeller
See Also:
findMatchingBeans(java.lang.Class), AbstractBeanFactory.createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[]), RootBeanDefinition, DefaultListableBeanFactory

Field Summary
 
Fields inherited from class org.springframework.beans.factory.support.AbstractBeanFactory
logger
 
Fields inherited from interface org.springframework.beans.factory.config.AutowireCapableBeanFactory
AUTOWIRE_AUTODETECT, AUTOWIRE_BY_NAME, AUTOWIRE_BY_TYPE, AUTOWIRE_CONSTRUCTOR
 
Fields inherited from interface org.springframework.beans.factory.BeanFactory
FACTORY_BEAN_PREFIX
 
Constructor Summary
AbstractAutowireCapableBeanFactory()
          Create a new AbstractAutowireCapableBeanFactory.
AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory)
          Create a new AbstractAutowireCapableBeanFactory with the given parent.
 
Method Summary
 Object applyBeanPostProcessorsAfterInitialization(Object bean, String name)
          Apply BeanPostProcessors to the given existing bean instance, invoking their postProcessAfterInitialization methods.
 Object applyBeanPostProcessorsBeforeInitialization(Object bean, String name)
          Apply BeanPostProcessors to the given existing bean instance, invoking their postProcessBeforeInitialization methods.
 void applyBeanPropertyValues(Object existingBean, String name)
          Apply the property values of the bean definition with the given name to the given bean instance.
 Object autowire(Class beanClass, int autowireMode, boolean dependencyCheck)
          Create a new bean instance of the given class with the specified autowire strategy.
 void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
          Autowire the bean properties of the given bean instance by name or type.
protected  void autowireByName(String beanName, RootBeanDefinition mergedBeanDefinition, BeanWrapper bw, MutablePropertyValues pvs)
          Fills in any missing property values with references to other beans in this factory if autowire is set to "byName".
protected  void autowireByType(String beanName, RootBeanDefinition mergedBeanDefinition, BeanWrapper bw, MutablePropertyValues pvs)
          Abstract method defining "autowire by type" (bean properties by type) behavior.
protected  BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mergedBeanDefinition)
          "autowire constructor" (with constructor arguments by type) behavior.
protected  Object createBean(String beanName, RootBeanDefinition mergedBeanDefinition, Object[] args)
          Delegates to full createBean version with allowEagerCaching=true.
protected  Object createBean(String beanName, RootBeanDefinition mergedBeanDefinition, Object[] args, boolean allowEagerCaching)
          Create a bean instance for the given bean definition.
protected  void dependencyCheck(String beanName, RootBeanDefinition mergedBeanDefinition, BeanWrapper bw, PropertyValues pvs)
          Perform a dependency check that all properties exposed have been set, if desired.
protected abstract  Map findMatchingBeans(Class requiredType)
          Find bean instances that match the required type.
protected  BeanWrapper instantiateUsingFactoryMethod(String beanName, RootBeanDefinition mergedBeanDefinition, Object[] args)
          Instantiate the bean using a named factory method.
protected  void invokeCustomInitMethod(String beanName, Object bean, String initMethodName)
          Invoke the specified custom init method on the given bean.
protected  void invokeInitMethods(String beanName, Object bean, RootBeanDefinition mergedBeanDefinition)
          Give a bean a chance to react now all its properties are set, and a chance to know about its owning bean factory (this object).
protected  void populateBean(String beanName, RootBeanDefinition mergedBeanDefinition, BeanWrapper bw)
          Populate the bean instance in the given BeanWrapper with the property values from the bean definition.
protected  Object resolveValueIfNecessary(String beanName, RootBeanDefinition mergedBeanDefinition, String argName, Object value)
          Given a PropertyValue, return a value, resolving any references to other beans in the factory if necessary.
protected  void setInstantiationStrategy(InstantiationStrategy instantiationStrategy)
          Set the instantiation strategy to use.
protected  String[] unsatisfiedObjectProperties(RootBeanDefinition mergedBeanDefinition, BeanWrapper bw)
          Return an array of object-type property names that are unsatisfied.
 
Methods inherited from class org.springframework.beans.factory.support.AbstractBeanFactory
addBeanPostProcessor, addSingleton, checkMergedBeanDefinition, containsBean, containsBeanDefinition, destroyBean, destroySingletons, getAliases, getBean, getBean, getBean, getBean, getBeanDefinition, getBeanPostProcessors, getCustomEditors, getIgnoredDependencyTypes, getMergedBeanDefinition, getMergedBeanDefinition, getObjectForSharedInstance, getParentBeanFactory, getSingletonNames, getType, ignoreDependencyType, initBeanWrapper, invokeCustomDestroyMethod, invokeDestroyMethods, isFactoryBean, isFactoryDereference, isSingleton, registerAlias, registerCustomEditor, registerDependentBean, registerDisposableBean, registerDisposableBean, registerSingleton, removeSingleton, setParentBeanFactory, transformedBeanName
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.springframework.beans.factory.BeanFactory
containsBean, getAliases, getBean, getBean, getType, isSingleton
 

Constructor Detail

AbstractAutowireCapableBeanFactory

public AbstractAutowireCapableBeanFactory()
Create a new AbstractAutowireCapableBeanFactory.


AbstractAutowireCapableBeanFactory

public AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory)
Create a new AbstractAutowireCapableBeanFactory with the given parent.

Parameters:
parentBeanFactory - parent bean factory, or null if none
Method Detail

setInstantiationStrategy

protected void setInstantiationStrategy(InstantiationStrategy instantiationStrategy)
Set the instantiation strategy to use. Can be called by subclasses during initialization. Default is CglibSubclassingInstantiationStrategy.

See Also:
CglibSubclassingInstantiationStrategy

autowire

public Object autowire(Class beanClass,
                       int autowireMode,
                       boolean dependencyCheck)
                throws BeansException
Description copied from interface: AutowireCapableBeanFactory
Create a new bean instance of the given class with the specified autowire strategy. All constants defined in this interface are supported here.

Specified by:
autowire in interface AutowireCapableBeanFactory
Parameters:
beanClass - the class of the bean to instantiate
autowireMode - by name or type, using the constants in this interface
dependencyCheck - whether to perform a dependency check for objects (not applicable to autowiring a constructor, thus ignored there)
Returns:
the new bean instance
Throws:
BeansException - if instantiation respectively wiring failed
See Also:
AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT

autowireBeanProperties

public void autowireBeanProperties(Object existingBean,
                                   int autowireMode,
                                   boolean dependencyCheck)
                            throws BeansException
Description copied from interface: AutowireCapableBeanFactory
Autowire the bean properties of the given bean instance by name or type.

Specified by:
autowireBeanProperties in interface AutowireCapableBeanFactory
Parameters:
existingBean - the existing bean instance
autowireMode - by name or type, using the constants in this interface
dependencyCheck - whether to perform a dependency check for object
Throws:
BeansException - if wiring failed
See Also:
AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE

applyBeanPropertyValues

public void applyBeanPropertyValues(Object existingBean,
                                    String name)
                             throws BeansException
Description copied from interface: AutowireCapableBeanFactory
Apply the property values of the bean definition with the given name to the given bean instance. The bean definition can either define a fully self-contained bean, reusing its property values, or just property values meant to be used for existing bean instances.

Specified by:
applyBeanPropertyValues in interface AutowireCapableBeanFactory
Parameters:
existingBean - the existing bean instance
name - the name of the bean definition in the bean factory
Throws:
BeansException - if applying the property values failed

applyBeanPostProcessorsBeforeInitialization

public Object applyBeanPostProcessorsBeforeInitialization(Object bean,
                                                          String name)
                                                   throws BeansException
Description copied from interface: AutowireCapableBeanFactory
Apply BeanPostProcessors to the given existing bean instance, invoking their postProcessBeforeInitialization methods. The returned bean instance may be a wrapper around the original.

Specified by:
applyBeanPostProcessorsBeforeInitialization in interface AutowireCapableBeanFactory
Parameters:
bean - the new bean instance
name - the name of the bean
Returns:
the bean instance to use, either the original or a wrapped one
Throws:
BeansException - if any post-processing failed
See Also:
BeanPostProcessor.postProcessBeforeInitialization(java.lang.Object, java.lang.String)

applyBeanPostProcessorsAfterInitialization

public Object applyBeanPostProcessorsAfterInitialization(Object bean,
                                                         String name)
                                                  throws BeansException
Description copied from interface: AutowireCapableBeanFactory
Apply BeanPostProcessors to the given existing bean instance, invoking their postProcessAfterInitialization methods. The returned bean instance may be a wrapper around the original.

Specified by:
applyBeanPostProcessorsAfterInitialization in interface AutowireCapableBeanFactory
Parameters:
bean - the new bean instance
name - the name of the bean
Returns:
the bean instance to use, either the original or a wrapped one
Throws:
BeansException - if any post-processing failed
See Also:
BeanPostProcessor.postProcessAfterInitialization(java.lang.Object, java.lang.String)

createBean

protected Object createBean(String beanName,
                            RootBeanDefinition mergedBeanDefinition,
                            Object[] args)
                     throws BeansException
Delegates to full createBean version with allowEagerCaching=true.

Specified by:
createBean in class AbstractBeanFactory
Parameters:
beanName - name of the bean
mergedBeanDefinition - the bean definition for the bean
args - arguments to use if creating a prototype using explicit arguments to a static factory method. This parameter must be null except in this case.
Returns:
a new instance of the bean
Throws:
BeansException - in case of errors
See Also:
createBean(String, RootBeanDefinition, Object[], boolean)

createBean

protected Object createBean(String beanName,
                            RootBeanDefinition mergedBeanDefinition,
                            Object[] args,
                            boolean allowEagerCaching)
                     throws BeansException
Create a bean instance for the given bean definition.

Parameters:
beanName - name of the bean
mergedBeanDefinition - the bean definition for the bean
allowEagerCaching - whether eager caching of singletons is allowed (typically true for normal beans, but false for inner beans)
args - arguments to use if this is a prototype constructed by a factory method. In this case, this will override any args specified in the bean definitions. This parameter should be null otherwise.
Returns:
a new instance of the bean
Throws:
BeansException - in case of errors

instantiateUsingFactoryMethod

protected BeanWrapper instantiateUsingFactoryMethod(String beanName,
                                                    RootBeanDefinition mergedBeanDefinition,
                                                    Object[] args)
                                             throws BeansException
Instantiate the bean using a named factory method. The method may be static, if the mergedBeanDefinition parameter specifies a class, rather than a factoryBean, or an instance variable on a factory object itself configured using Dependency Injection.

Implementation requires iterating over the static or instance methods with the name specified in the RootBeanDefinition (the method may be overloaded) and trying to match with the parameters. We don't have the types attached to constructor args, so trial and error is the only way to go here. The args array may contain argument values passed in programmatically via the overloaded getBean() method.

Throws:
BeansException

autowireConstructor

protected BeanWrapper autowireConstructor(String beanName,
                                          RootBeanDefinition mergedBeanDefinition)
                                   throws BeansException
"autowire constructor" (with constructor arguments by type) behavior. Also applied if explicit constructor argument values are specified, matching all remaining arguments with beans from the bean factory.

This corresponds to constructor injection: In this mode, a Spring bean factory is able to host components that expect constructor-based dependency resolution.

Parameters:
beanName - name of the bean to autowire by type
mergedBeanDefinition - bean definition to update through autowiring
Returns:
BeanWrapper for the new instance
Throws:
BeansException

populateBean

protected void populateBean(String beanName,
                            RootBeanDefinition mergedBeanDefinition,
                            BeanWrapper bw)
                     throws BeansException
Populate the bean instance in the given BeanWrapper with the property values from the bean definition.

Parameters:
beanName - name of the bean
mergedBeanDefinition - the bean definition for the bean
bw - BeanWrapper with bean instance
Throws:
BeansException

autowireByName

protected void autowireByName(String beanName,
                              RootBeanDefinition mergedBeanDefinition,
                              BeanWrapper bw,
                              MutablePropertyValues pvs)
                       throws BeansException
Fills in any missing property values with references to other beans in this factory if autowire is set to "byName".

Parameters:
beanName - name of the bean we're wiring up. Useful for debugging messages; not used functionally.
mergedBeanDefinition - bean definition to update through autowiring
bw - BeanWrapper from which we can obtain information about the bean
pvs - the PropertyValues to register wired objects with
Throws:
BeansException

autowireByType

protected void autowireByType(String beanName,
                              RootBeanDefinition mergedBeanDefinition,
                              BeanWrapper bw,
                              MutablePropertyValues pvs)
                       throws BeansException
Abstract method defining "autowire by type" (bean properties by type) behavior.

This is like PicoContainer default, in which there must be exactly one bean of the property type in the bean factory. This makes bean factories simple to configure for small namespaces, but doesn't work as well as standard Spring behavior for bigger applications.

Parameters:
beanName - name of the bean to autowire by type
mergedBeanDefinition - bean definition to update through autowiring
bw - BeanWrapper from which we can obtain information about the bean
pvs - the PropertyValues to register wired objects with
Throws:
BeansException

unsatisfiedObjectProperties

protected String[] unsatisfiedObjectProperties(RootBeanDefinition mergedBeanDefinition,
                                               BeanWrapper bw)
Return an array of object-type property names that are unsatisfied. These are probably unsatisfied references to other beans in the factory. Does not include simple properties like primitives or Strings.

Parameters:
mergedBeanDefinition - the bean definition the bean was created with
bw - the BeanWrapper the bean was created with
Returns:
an array of object-type property names that are unsatisfied
See Also:
BeanUtils.isSimpleProperty(java.lang.Class)

dependencyCheck

protected void dependencyCheck(String beanName,
                               RootBeanDefinition mergedBeanDefinition,
                               BeanWrapper bw,
                               PropertyValues pvs)
                        throws UnsatisfiedDependencyException
Perform a dependency check that all properties exposed have been set, if desired. Dependency checks can be objects (collaborating beans), simple (primitives and String), or all (both).

Parameters:
beanName - the name of the bean
mergedBeanDefinition - the bean definition the bean was created with
bw - the BeanWrapper the bean was created with
pvs - the property values to be applied to the bean
Throws:
UnsatisfiedDependencyException

resolveValueIfNecessary

protected Object resolveValueIfNecessary(String beanName,
                                         RootBeanDefinition mergedBeanDefinition,
                                         String argName,
                                         Object value)
                                  throws BeansException
Given a PropertyValue, return a value, resolving any references to other beans in the factory if necessary. The value could be:
  • A BeanDefinition, which leads to the creation of a corresponding new bean instance. Singleton flags and names of such "inner beans" are always ignored: Inner beans are anonymous prototypes.
  • A RuntimeBeanReference, which must be resolved.
  • A ManagedList. This is a special collection that may contain RuntimeBeanReferences or Collections that will need to be resolved.
  • A ManagedSet. May also contain RuntimeBeanReferences or Collections that will need to be resolved.
  • A ManagedMap. In this case the value may be a RuntimeBeanReference or Collection that will need to be resolved.
  • An ordinary object or null, in which case it's left alone.

    Throws:
    BeansException

  • invokeInitMethods

    protected void invokeInitMethods(String beanName,
                                     Object bean,
                                     RootBeanDefinition mergedBeanDefinition)
                              throws Throwable
    Give a bean a chance to react now all its properties are set, and a chance to know about its owning bean factory (this object). This means checking whether the bean implements InitializingBean or defines a custom init method, and invoking the necessary callback(s) if it does.

    To be called by createBean implementations of concrete subclasses.

    Parameters:
    beanName - the bean has in the factory. Used for debug output.
    bean - new bean instance we may need to initialize
    mergedBeanDefinition - the bean definition that the bean was created with (can also be null, if initializing )
    Throws:
    Throwable - if thrown by init methods or by the invocation process
    See Also:
    invokeCustomInitMethod(java.lang.String, java.lang.Object, java.lang.String), createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

    invokeCustomInitMethod

    protected void invokeCustomInitMethod(String beanName,
                                          Object bean,
                                          String initMethodName)
                                   throws Throwable
    Invoke the specified custom init method on the given bean. Called by invokeInitMethods.

    Can be overridden in subclasses for custom resolution of init methods with arguments.

    Parameters:
    beanName - the bean has in the factory. Used for debug output.
    bean - new bean instance we may need to initialize
    initMethodName - the name of the custom init method
    Throws:
    Throwable
    See Also:
    invokeInitMethods(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)

    findMatchingBeans

    protected abstract Map findMatchingBeans(Class requiredType)
                                      throws BeansException
    Find bean instances that match the required type. Called by autowiring. If a subclass cannot obtain information about bean names by type, a corresponding exception should be thrown.

    Parameters:
    requiredType - the type of the beans to look up
    Returns:
    a Map of bean names and bean instances that match the required type, or null if none found
    Throws:
    BeansException - in case of errors
    See Also:
    autowireByType(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, org.springframework.beans.BeanWrapper, org.springframework.beans.MutablePropertyValues), autowireConstructor(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition)


    Copyright (C) 2003-2004 The Spring Framework Project.