Class AbstractAutowireCapableBeanFactory
- All Implemented Interfaces:
BeanFactory
,AutowireCapableBeanFactory
,ConfigurableBeanFactory
,SingletonBeanRegistry
,HierarchicalBeanFactory
,AliasRegistry
- Direct Known Subclasses:
DefaultListableBeanFactory
RootBeanDefinition
class.
Implements the AutowireCapableBeanFactory
interface in addition to AbstractBeanFactory's createBean(java.lang.Class<T>)
method.
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
AutowireCapableBeanFactory.resolveDependency(DependencyDescriptor, String, Set, TypeConverter)
,
used for autowiring by type. In case of a factory which is capable of searching
its bean definitions, matching beans will typically be implemented through such
a search. For other factory styles, simplified matching algorithms can be implemented.
Note 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 and SPI
view of such a factory, respectively.
- Since:
- 13.02.2004
- Author:
- Rod Johnson, Juergen Hoeller, Rob Harrop, Mark Fisher, Costin Leau, Chris Beams, Sam Brannen, Phillip Webb
- See Also:
-
Field Summary
Fields inherited from class org.springframework.core.SimpleAliasRegistry
logger
Fields inherited from interface org.springframework.beans.factory.config.AutowireCapableBeanFactory
AUTOWIRE_AUTODETECT, AUTOWIRE_BY_NAME, AUTOWIRE_BY_TYPE, AUTOWIRE_CONSTRUCTOR, AUTOWIRE_NO, ORIGINAL_INSTANCE_SUFFIX
Fields inherited from interface org.springframework.beans.factory.BeanFactory
FACTORY_BEAN_PREFIX
Fields inherited from interface org.springframework.beans.factory.config.ConfigurableBeanFactory
SCOPE_PROTOTYPE, SCOPE_SINGLETON
-
Constructor Summary
ConstructorDescriptionCreate a new AbstractAutowireCapableBeanFactory.AbstractAutowireCapableBeanFactory
(BeanFactory parentBeanFactory) Create a new AbstractAutowireCapableBeanFactory with the given parent. -
Method Summary
Modifier and TypeMethodDescriptionapplyBeanPostProcessorsAfterInitialization
(Object existingBean, String beanName) ApplyBeanPostProcessors
to the given existing bean instance, invoking theirpostProcessAfterInitialization
methods.applyBeanPostProcessorsBeforeInitialization
(Object existingBean, String beanName) ApplyBeanPostProcessors
to the given existing bean instance, invoking theirpostProcessBeforeInitialization
methods.protected Object
applyBeanPostProcessorsBeforeInstantiation
(Class<?> beanClass, String beanName) Apply InstantiationAwareBeanPostProcessors to the specified bean definition (by class and name), invoking theirpostProcessBeforeInstantiation
methods.void
applyBeanPropertyValues
(Object existingBean, String beanName) Apply the property values of the bean definition with the given name to the given bean instance.protected void
applyMergedBeanDefinitionPostProcessors
(RootBeanDefinition mbd, Class<?> beanType, String beanName) Apply MergedBeanDefinitionPostProcessors to the specified bean definition, invoking theirpostProcessMergedBeanDefinition
methods.protected void
applyPropertyValues
(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) Apply the given property values, resolving any runtime references to other beans in this bean factory.Instantiate a new bean instance of the given class with the specified autowire strategy.void
autowireBean
(Object existingBean) Populate the given bean instance through applying after-instantiation callbacks and bean property post-processing (e.g.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, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) Fill in any missing property values with references to other beans in this factory if autowire is set to "byName".protected void
autowireByType
(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) Abstract method defining "autowire by type" (bean properties by type) behavior.protected BeanWrapper
autowireConstructor
(String beanName, RootBeanDefinition mbd, Constructor<?>[] ctors, Object[] explicitArgs) "autowire constructor" (with constructor arguments by type) behavior.protected void
checkDependencies
(String beanName, AbstractBeanDefinition mbd, PropertyDescriptor[] pds, PropertyValues pvs) Perform a dependency check that all properties exposed have been set, if desired.protected void
Overridden to clear FactoryBean instance cache as well.configureBean
(Object existingBean, String beanName) Configure the given raw bean: autowiring bean properties, applying bean property values, applying factory callbacks such assetBeanName
andsetBeanFactory
, and also applying all bean post processors (including ones which might wrap the given raw bean).void
copyConfigurationFrom
(ConfigurableBeanFactory otherFactory) Copy all relevant configuration from the given other factory.createBean
(Class<?> beanClass, int autowireMode, boolean dependencyCheck) Fully create a new bean instance of the given class with the specified autowire strategy.<T> T
createBean
(Class<T> beanClass) Fully create a new bean instance of the given class.protected Object
createBean
(String beanName, RootBeanDefinition mbd, Object[] args) Central method of this class: creates a bean instance, populates the bean instance, applies post-processors, etc.protected BeanWrapper
createBeanInstance
(String beanName, RootBeanDefinition mbd, Object[] args) Create a new instance for the specified bean, using an appropriate instantiation strategy: factory method, constructor autowiring, or simple instantiation.void
destroyBean
(Object existingBean) Destroy the given bean instance (typically coming fromAutowireCapableBeanFactory.createBean(java.lang.Class<T>)
), applying theDisposableBean
contract as well as registeredDestructionAwareBeanPostProcessors
.protected Constructor<?>[]
determineConstructorsFromBeanPostProcessors
(Class<?> beanClass, String beanName) Determine candidate constructors to use for the given bean, checking all registeredSmartInstantiationAwareBeanPostProcessors
.protected Class<?>
determineTargetType
(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) Determine the target type for the given bean definition.protected Object
doCreateBean
(String beanName, RootBeanDefinition mbd, Object[] args) Actually create the specified bean.protected PropertyDescriptor[]
Extract a filtered set of PropertyDescriptors from the given BeanWrapper, excluding ignored dependency types or properties defined on ignored dependency interfaces.protected PropertyDescriptor[]
filterPropertyDescriptorsForDependencyCheck
(BeanWrapper bw, boolean cache) Extract a filtered set of PropertyDescriptors from the given BeanWrapper, excluding ignored dependency types or properties defined on ignored dependency interfaces.protected Object
getEarlyBeanReference
(String beanName, RootBeanDefinition mbd, Object bean) Obtain a reference for early access to the specified bean, typically for the purpose of resolving a circular reference.Return the instantiation strategy to use for creating bean instances.protected Object
getObjectForBeanInstance
(Object beanInstance, String name, String beanName, RootBeanDefinition mbd) Overridden in order to implicitly register the currently created bean as dependent on further beans getting programmatically retrieved during aSupplier
callback.Return the ParameterNameDiscoverer to use for resolving method parameter names if needed.protected ResolvableType
getTypeForFactoryBean
(String beanName, RootBeanDefinition mbd, boolean allowInit) This implementation attempts to query the FactoryBean's generic parameter metadata if present to determine the object type.protected Class<?>
getTypeForFactoryMethod
(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) Determine the target type for the given bean definition which is based on a factory method.void
ignoreDependencyInterface
(Class<?> ifc) Ignore the given dependency interface for autowiring.void
ignoreDependencyType
(Class<?> type) Ignore the given dependency type for autowiring: for example, String.initializeBean
(Object existingBean, String beanName) Initialize the given raw bean, applying factory callbacks such assetBeanName
andsetBeanFactory
, also applying all bean post processors (including ones which might wrap the given raw bean).protected Object
initializeBean
(String beanName, Object bean, RootBeanDefinition mbd) Initialize the given bean instance, applying factory callbacks as well as init methods and bean post processors.protected BeanWrapper
instantiateBean
(String beanName, RootBeanDefinition mbd) Instantiate the given bean using its default constructor.protected BeanWrapper
instantiateUsingFactoryMethod
(String beanName, RootBeanDefinition mbd, Object[] explicitArgs) Instantiate the bean using a named factory method.protected void
invokeCustomInitMethod
(String beanName, Object bean, RootBeanDefinition mbd, String initMethodName) Invoke the specified custom init method on the given bean.protected void
invokeInitMethods
(String beanName, Object bean, RootBeanDefinition mbd) 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).boolean
Return whether to allow circular references between beans.boolean
Return whether to allow the raw injection of a bean instance.protected boolean
Determine whether the given bean property is excluded from dependency checks.protected Object
obtainInstanceFromSupplier
(Supplier<?> supplier, String beanName, RootBeanDefinition mbd) Obtain a bean instance from the given supplier.protected void
populateBean
(String beanName, RootBeanDefinition mbd, BeanWrapper bw) Populate the bean instance in the given BeanWrapper with the property values from the bean definition.protected Object
postProcessObjectFromFactoryBean
(Object object, String beanName) Applies thepostProcessAfterInitialization
callback of all registered BeanPostProcessors, giving them a chance to post-process the object obtained from FactoryBeans (for example, to auto-proxy them).protected Class<?>
predictBeanType
(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) Predict the eventual bean type (of the processed bean instance) for the specified bean.protected void
removeSingleton
(String beanName) Overridden to clear FactoryBean instance cache as well.resolveBeanByName
(String name, DependencyDescriptor descriptor) Resolve a bean instance for the given bean name, providing a dependency descriptor for exposure to target factory methods.protected Object
resolveBeforeInstantiation
(String beanName, RootBeanDefinition mbd) Apply before-instantiation post-processors, resolving whether there is a before-instantiation shortcut for the specified bean.resolveDependency
(DependencyDescriptor descriptor, String requestingBeanName) Resolve the specified dependency against the beans defined in this factory.void
setAllowCircularReferences
(boolean allowCircularReferences) Set whether to allow circular references between beans - and automatically try to resolve them.void
setAllowRawInjectionDespiteWrapping
(boolean allowRawInjectionDespiteWrapping) Set whether to allow the raw injection of a bean instance into some other bean's property, despite the injected bean eventually getting wrapped (for example, through AOP auto-proxying).void
setInstantiationStrategy
(InstantiationStrategy instantiationStrategy) Set the instantiation strategy to use for creating bean instances.void
setParameterNameDiscoverer
(ParameterNameDiscoverer parameterNameDiscoverer) Set the ParameterNameDiscoverer to use for resolving method parameter names if needed (e.g.protected String[]
Return an array of non-simple bean properties that are unsatisfied.Methods inherited from class org.springframework.beans.factory.support.AbstractBeanFactory
addBeanPostProcessor, addBeanPostProcessors, addEmbeddedValueResolver, addPropertyEditorRegistrar, afterPrototypeCreation, beforePrototypeCreation, checkMergedBeanDefinition, cleanupAfterBeanCreationFailure, clearMergedBeanDefinition, clearMetadataCache, containsBean, containsBeanDefinition, containsLocalBean, copyRegisteredEditorsTo, destroyBean, destroyBean, destroyScopedBean, doGetBean, evaluateBeanDefinitionString, getAliases, getApplicationStartup, getBean, getBean, getBean, getBean, getBeanClassLoader, getBeanDefinition, getBeanExpressionResolver, getBeanPostProcessorCount, getBeanPostProcessors, getConversionService, getCustomEditors, getCustomTypeConverter, getMergedBeanDefinition, getMergedBeanDefinition, getMergedBeanDefinition, getMergedLocalBeanDefinition, getParentBeanFactory, getPropertyEditorRegistrars, getRegisteredScope, getRegisteredScopeNames, getTempClassLoader, getType, getType, getTypeConverter, hasBeanCreationStarted, hasDestructionAwareBeanPostProcessors, hasEmbeddedValueResolver, hasInstantiationAwareBeanPostProcessors, initBeanWrapper, isActuallyInCreation, isBeanEligibleForMetadataCaching, isBeanNameInUse, isCacheBeanMetadata, isFactoryBean, isFactoryBean, isPrototype, isPrototypeCurrentlyInCreation, isSingleton, isTypeMatch, isTypeMatch, isTypeMatch, markBeanAsCreated, originalBeanName, registerCustomEditor, registerCustomEditors, registerDisposableBeanIfNecessary, registerScope, removeSingletonIfCreatedForTypeCheckOnly, requiresDestruction, resolveBeanClass, resolveEmbeddedValue, setApplicationStartup, setBeanClassLoader, setBeanExpressionResolver, setCacheBeanMetadata, setConversionService, setParentBeanFactory, setTempClassLoader, setTypeConverter, transformedBeanName
Methods inherited from class org.springframework.beans.factory.support.FactoryBeanRegistrySupport
getCachedObjectForFactoryBean, getFactoryBean, getObjectFromFactoryBean, getTypeForFactoryBean
Methods inherited from class org.springframework.beans.factory.support.DefaultSingletonBeanRegistry
addSingleton, addSingletonFactory, afterSingletonCreation, beforeSingletonCreation, containsSingleton, destroyBean, destroySingleton, destroySingletons, getDependenciesForBean, getDependentBeans, getSingleton, getSingleton, getSingleton, getSingletonCount, getSingletonMutex, getSingletonNames, hasDependentBean, isCurrentlyInCreation, isDependent, isSingletonCurrentlyInCreation, onSuppressedException, registerContainedBean, registerDependentBean, registerDisposableBean, registerSingleton, setCurrentlyInCreation
Methods inherited from class org.springframework.core.SimpleAliasRegistry
allowAliasOverriding, canonicalName, checkForAliasCircle, hasAlias, isAlias, registerAlias, removeAlias, resolveAliases
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.config.AutowireCapableBeanFactory
resolveDependency, resolveNamedBean
Methods inherited from interface org.springframework.beans.factory.BeanFactory
containsBean, getAliases, getBean, getBean, getBean, getBean, getBean, getBeanProvider, getBeanProvider, getType, getType, isPrototype, isSingleton, isTypeMatch, isTypeMatch
Methods inherited from interface org.springframework.beans.factory.config.ConfigurableBeanFactory
destroySingletons, getDependenciesForBean, getDependentBeans, isCurrentlyInCreation, registerAlias, registerDependentBean, resolveAliases, setCurrentlyInCreation
Methods inherited from interface org.springframework.beans.factory.config.SingletonBeanRegistry
containsSingleton, getSingleton, getSingletonCount, getSingletonMutex, getSingletonNames, registerSingleton
-
Constructor Details
-
AbstractAutowireCapableBeanFactory
public AbstractAutowireCapableBeanFactory()Create a new AbstractAutowireCapableBeanFactory. -
AbstractAutowireCapableBeanFactory
Create a new AbstractAutowireCapableBeanFactory with the given parent.- Parameters:
parentBeanFactory
- parent bean factory, ornull
if none
-
-
Method Details
-
setInstantiationStrategy
Set the instantiation strategy to use for creating bean instances. Default is CglibSubclassingInstantiationStrategy.- See Also:
-
getInstantiationStrategy
Return the instantiation strategy to use for creating bean instances. -
setParameterNameDiscoverer
Set the ParameterNameDiscoverer to use for resolving method parameter names if needed (e.g. for constructor names).Default is a
DefaultParameterNameDiscoverer
. -
getParameterNameDiscoverer
Return the ParameterNameDiscoverer to use for resolving method parameter names if needed. -
setAllowCircularReferences
public void setAllowCircularReferences(boolean allowCircularReferences) Set whether to allow circular references between beans - and automatically try to resolve them.Note that circular reference resolution means that one of the involved beans will receive a reference to another bean that is not fully initialized yet. This can lead to subtle and not-so-subtle side effects on initialization; it does work fine for many scenarios, though.
Default is "true". Turn this off to throw an exception when encountering a circular reference, disallowing them completely.
NOTE: It is generally recommended to not rely on circular references between your beans. Refactor your application logic to have the two beans involved delegate to a third bean that encapsulates their common logic.
-
isAllowCircularReferences
public boolean isAllowCircularReferences()Return whether to allow circular references between beans.- Since:
- 5.3.10
- See Also:
-
setAllowRawInjectionDespiteWrapping
public void setAllowRawInjectionDespiteWrapping(boolean allowRawInjectionDespiteWrapping) Set whether to allow the raw injection of a bean instance into some other bean's property, despite the injected bean eventually getting wrapped (for example, through AOP auto-proxying).This will only be used as a last resort in case of a circular reference that cannot be resolved otherwise: essentially, preferring a raw instance getting injected over a failure of the entire bean wiring process.
Default is "false", as of Spring 2.0. Turn this on to allow for non-wrapped raw beans injected into some of your references, which was Spring 1.2's (arguably unclean) default behavior.
NOTE: It is generally recommended to not rely on circular references between your beans, in particular with auto-proxying involved.
- See Also:
-
isAllowRawInjectionDespiteWrapping
public boolean isAllowRawInjectionDespiteWrapping()Return whether to allow the raw injection of a bean instance.- Since:
- 5.3.10
- See Also:
-
ignoreDependencyType
Ignore the given dependency type for autowiring: for example, String. Default is none. -
ignoreDependencyInterface
Ignore the given dependency interface for autowiring.This will typically be used by application contexts to register dependencies that are resolved in other ways, like BeanFactory through BeanFactoryAware or ApplicationContext through ApplicationContextAware.
By default, only the BeanFactoryAware interface is ignored. For further types to ignore, invoke this method for each type.
- See Also:
-
copyConfigurationFrom
Description copied from interface:ConfigurableBeanFactory
Copy all relevant configuration from the given other factory.Should include all standard configuration settings as well as BeanPostProcessors, Scopes, and factory-specific internal settings. Should not include any metadata of actual bean definitions, such as BeanDefinition objects and bean name aliases.
- Specified by:
copyConfigurationFrom
in interfaceConfigurableBeanFactory
- Overrides:
copyConfigurationFrom
in classAbstractBeanFactory
- Parameters:
otherFactory
- the other BeanFactory to copy from
-
createBean
Description copied from interface:AutowireCapableBeanFactory
Fully create a new bean instance of the given class.Performs full initialization of the bean, including all applicable
BeanPostProcessors
.Note: This is intended for creating a fresh instance, populating annotated fields and methods as well as applying all standard bean initialization callbacks. Constructor resolution is based on Kotlin primary / single public / single non-public, with a fallback to the default constructor in ambiguous scenarios, also influenced by
SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors(java.lang.Class<?>, java.lang.String)
(e.g. for annotation-driven constructor selection).- Specified by:
createBean
in interfaceAutowireCapableBeanFactory
- Parameters:
beanClass
- the class of the bean to create- Returns:
- the new bean instance
- Throws:
BeansException
- if instantiation or wiring failed
-
autowireBean
Description copied from interface:AutowireCapableBeanFactory
Populate the given bean instance through applying after-instantiation callbacks and bean property post-processing (e.g. for annotation-driven injection).Note: This is essentially intended for (re-)populating annotated fields and methods, either for new instances or for deserialized instances. It does not imply traditional by-name or by-type autowiring of properties; use
AutowireCapableBeanFactory.autowireBeanProperties(java.lang.Object, int, boolean)
for those purposes.- Specified by:
autowireBean
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the existing bean instance
-
configureBean
Description copied from interface:AutowireCapableBeanFactory
Configure the given raw bean: autowiring bean properties, applying bean property values, applying factory callbacks such assetBeanName
andsetBeanFactory
, and also applying all bean post processors (including ones which might wrap the given raw bean).This is effectively a superset of what
AutowireCapableBeanFactory.initializeBean(java.lang.Object, java.lang.String)
provides, fully applying the configuration specified by the corresponding bean definition. Note: This method requires a bean definition for the given name!- Specified by:
configureBean
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the existing bean instancebeanName
- the name of the bean, to be passed to it if necessary (a bean definition of that name has to be available)- Returns:
- the bean instance to use, either the original or a wrapped one
- Throws:
NoSuchBeanDefinitionException
- if there is no bean definition with the given nameBeansException
- if the initialization failed- See Also:
-
createBean
public Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException Description copied from interface:AutowireCapableBeanFactory
Fully create a new bean instance of the given class with the specified autowire strategy. All constants defined in this interface are supported here.Performs full initialization of the bean, including all applicable
BeanPostProcessors
. This is effectively a superset of whatAutowireCapableBeanFactory.autowire(java.lang.Class<?>, int, boolean)
provides, addingAutowireCapableBeanFactory.initializeBean(java.lang.Object, java.lang.String)
behavior.- Specified by:
createBean
in interfaceAutowireCapableBeanFactory
- Parameters:
beanClass
- the class of the bean to createautowireMode
- by name or type, using the constants in this interfacedependencyCheck
- 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 or wiring failed- See Also:
-
autowire
public Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException Description copied from interface:AutowireCapableBeanFactory
Instantiate a new bean instance of the given class with the specified autowire strategy. All constants defined in this interface are supported here. Can also be invoked withAUTOWIRE_NO
in order to just apply before-instantiation callbacks (e.g. for annotation-driven injection).Does not apply standard
BeanPostProcessors
callbacks or perform any further initialization of the bean. This interface offers distinct, fine-grained operations for those purposes, for exampleAutowireCapableBeanFactory.initializeBean(java.lang.Object, java.lang.String)
. However,InstantiationAwareBeanPostProcessor
callbacks are applied, if applicable to the construction of the instance.- Specified by:
autowire
in interfaceAutowireCapableBeanFactory
- Parameters:
beanClass
- the class of the bean to instantiateautowireMode
- by name or type, using the constants in this interfacedependencyCheck
- whether to perform a dependency check for object references in the bean instance (not applicable to autowiring a constructor, thus ignored there)- Returns:
- the new bean instance
- Throws:
BeansException
- if instantiation or wiring failed- See Also:
-
AutowireCapableBeanFactory.AUTOWIRE_NO
AutowireCapableBeanFactory.AUTOWIRE_BY_NAME
AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE
AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR
AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT
AutowireCapableBeanFactory.initializeBean(java.lang.Object, java.lang.String)
AutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(java.lang.Object, java.lang.String)
AutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(java.lang.Object, java.lang.String)
-
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. Can also be invoked withAUTOWIRE_NO
in order to just apply after-instantiation callbacks (e.g. for annotation-driven injection).Does not apply standard
BeanPostProcessors
callbacks or perform any further initialization of the bean. This interface offers distinct, fine-grained operations for those purposes, for exampleAutowireCapableBeanFactory.initializeBean(java.lang.Object, java.lang.String)
. However,InstantiationAwareBeanPostProcessor
callbacks are applied, if applicable to the configuration of the instance.- Specified by:
autowireBeanProperties
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the existing bean instanceautowireMode
- by name or type, using the constants in this interfacedependencyCheck
- whether to perform a dependency check for object references in the bean instance- Throws:
BeansException
- if wiring failed- See Also:
-
applyBeanPropertyValues
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.This method does not autowire bean properties; it just applies explicitly defined property values. Use the
AutowireCapableBeanFactory.autowireBeanProperties(java.lang.Object, int, boolean)
method to autowire an existing bean instance. Note: This method requires a bean definition for the given name!Does not apply standard
BeanPostProcessors
callbacks or perform any further initialization of the bean. This interface offers distinct, fine-grained operations for those purposes, for exampleAutowireCapableBeanFactory.initializeBean(java.lang.Object, java.lang.String)
. However,InstantiationAwareBeanPostProcessor
callbacks are applied, if applicable to the configuration of the instance.- Specified by:
applyBeanPropertyValues
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the existing bean instancebeanName
- the name of the bean definition in the bean factory (a bean definition of that name has to be available)- Throws:
NoSuchBeanDefinitionException
- if there is no bean definition with the given nameBeansException
- if applying the property values failed- See Also:
-
initializeBean
Description copied from interface:AutowireCapableBeanFactory
Initialize the given raw bean, applying factory callbacks such assetBeanName
andsetBeanFactory
, also applying all bean post processors (including ones which might wrap the given raw bean).Note that no bean definition of the given name has to exist in the bean factory. The passed-in bean name will simply be used for callbacks but not checked against the registered bean definitions.
- Specified by:
initializeBean
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the existing bean instancebeanName
- the name of the bean, to be passed to it if necessary (only passed toBeanPostProcessors
; can follow theAutowireCapableBeanFactory.ORIGINAL_INSTANCE_SUFFIX
convention in order to enforce the given instance to be returned, i.e. no proxies etc)- Returns:
- the bean instance to use, either the original or a wrapped one
- See Also:
-
applyBeanPostProcessorsBeforeInitialization
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException Description copied from interface:AutowireCapableBeanFactory
ApplyBeanPostProcessors
to the given existing bean instance, invoking theirpostProcessBeforeInitialization
methods. The returned bean instance may be a wrapper around the original.- Specified by:
applyBeanPostProcessorsBeforeInitialization
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the existing bean instancebeanName
- the name of the bean, to be passed to it if necessary (only passed toBeanPostProcessors
; can follow theAutowireCapableBeanFactory.ORIGINAL_INSTANCE_SUFFIX
convention in order to enforce the given instance to be returned, i.e. no proxies etc)- Returns:
- the bean instance to use, either the original or a wrapped one
- Throws:
BeansException
- if any post-processing failed- See Also:
-
applyBeanPostProcessorsAfterInitialization
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException Description copied from interface:AutowireCapableBeanFactory
ApplyBeanPostProcessors
to the given existing bean instance, invoking theirpostProcessAfterInitialization
methods. The returned bean instance may be a wrapper around the original.- Specified by:
applyBeanPostProcessorsAfterInitialization
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the existing bean instancebeanName
- the name of the bean, to be passed to it if necessary (only passed toBeanPostProcessors
; can follow theAutowireCapableBeanFactory.ORIGINAL_INSTANCE_SUFFIX
convention in order to enforce the given instance to be returned, i.e. no proxies etc)- Returns:
- the bean instance to use, either the original or a wrapped one
- Throws:
BeansException
- if any post-processing failed- See Also:
-
destroyBean
Description copied from interface:AutowireCapableBeanFactory
Destroy the given bean instance (typically coming fromAutowireCapableBeanFactory.createBean(java.lang.Class<T>)
), applying theDisposableBean
contract as well as registeredDestructionAwareBeanPostProcessors
.Any exception that arises during destruction should be caught and logged instead of propagated to the caller of this method.
- Specified by:
destroyBean
in interfaceAutowireCapableBeanFactory
- Parameters:
existingBean
- the bean instance to destroy
-
resolveBeanByName
Description copied from interface:AutowireCapableBeanFactory
Resolve a bean instance for the given bean name, providing a dependency descriptor for exposure to target factory methods.This is effectively a variant of
BeanFactory.getBean(String, Class)
which supports factory methods with anInjectionPoint
argument.- Specified by:
resolveBeanByName
in interfaceAutowireCapableBeanFactory
- Parameters:
name
- the name of the bean to look updescriptor
- the dependency descriptor for the requesting injection point- Returns:
- the corresponding bean instance
- See Also:
-
resolveDependency
@Nullable public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException Description copied from interface:AutowireCapableBeanFactory
Resolve the specified dependency against the beans defined in this factory.- Specified by:
resolveDependency
in interfaceAutowireCapableBeanFactory
- Parameters:
descriptor
- the descriptor for the dependency (field/method/constructor)requestingBeanName
- the name of the bean which declares the given dependency- Returns:
- the resolved object, or
null
if none found - Throws:
NoSuchBeanDefinitionException
- if no matching bean was foundNoUniqueBeanDefinitionException
- if more than one matching bean was foundBeansException
- if dependency resolution failed for any other reason- See Also:
-
createBean
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException Central method of this class: creates a bean instance, populates the bean instance, applies post-processors, etc.- Specified by:
createBean
in classAbstractBeanFactory
- Parameters:
beanName
- the name of the beanmbd
- the merged bean definition for the beanargs
- explicit arguments to use for constructor or factory method invocation- Returns:
- a new instance of the bean
- Throws:
BeanCreationException
- if the bean could not be created- See Also:
-
doCreateBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException Actually create the specified bean. Pre-creation processing has already happened at this point, e.g. checkingpostProcessBeforeInstantiation
callbacks.Differentiates between default bean instantiation, use of a factory method, and autowiring a constructor.
- Parameters:
beanName
- the name of the beanmbd
- the merged bean definition for the beanargs
- explicit arguments to use for constructor or factory method invocation- Returns:
- a new instance of the bean
- Throws:
BeanCreationException
- if the bean could not be created- See Also:
-
instantiateBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition)
instantiateUsingFactoryMethod(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
autowireConstructor(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.reflect.Constructor<?>[], java.lang.Object[])
-
predictBeanType
@Nullable protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) Description copied from class:AbstractBeanFactory
Predict the eventual bean type (of the processed bean instance) for the specified bean. Called byAbstractBeanFactory.getType(java.lang.String)
andAbstractBeanFactory.isTypeMatch(java.lang.String, org.springframework.core.ResolvableType)
. Does not need to handle FactoryBeans specifically, since it is only supposed to operate on the raw bean type.This implementation is simplistic in that it is not able to handle factory methods and InstantiationAwareBeanPostProcessors. It only predicts the bean type correctly for a standard bean. To be overridden in subclasses, applying more sophisticated type detection.
- Overrides:
predictBeanType
in classAbstractBeanFactory
- Parameters:
beanName
- the name of the beanmbd
- the merged bean definition to determine the type fortypesToMatch
- the types to match in case of internal type matching purposes (also signals that the returnedClass
will never be exposed to application code)- Returns:
- the type of the bean, or
null
if not predictable
-
determineTargetType
@Nullable protected Class<?> determineTargetType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) Determine the target type for the given bean definition.- Parameters:
beanName
- the name of the bean (for error handling purposes)mbd
- the merged bean definition for the beantypesToMatch
- the types to match in case of internal type matching purposes (also signals that the returnedClass
will never be exposed to application code)- Returns:
- the type for the bean if determinable, or
null
otherwise
-
getTypeForFactoryMethod
@Nullable protected Class<?> getTypeForFactoryMethod(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) Determine the target type for the given bean definition which is based on a factory method. Only called if there is no singleton instance registered for the target bean already.This implementation determines the type matching
createBean(java.lang.Class<T>)
's different creation strategies. As far as possible, we'll perform static type checking to avoid creation of the target bean.- Parameters:
beanName
- the name of the bean (for error handling purposes)mbd
- the merged bean definition for the beantypesToMatch
- the types to match in case of internal type matching purposes (also signals that the returnedClass
will never be exposed to application code)- Returns:
- the type for the bean if determinable, or
null
otherwise - See Also:
-
getTypeForFactoryBean
protected ResolvableType getTypeForFactoryBean(String beanName, RootBeanDefinition mbd, boolean allowInit) This implementation attempts to query the FactoryBean's generic parameter metadata if present to determine the object type. If not present, i.e. the FactoryBean is declared as a raw type, checks the FactoryBean'sgetObjectType
method on a plain instance of the FactoryBean, without bean properties applied yet. If this doesn't return a type yet, andallowInit
istrue
a full creation of the FactoryBean is used as fallback (through delegation to the superclass's implementation).The shortcut check for a FactoryBean is only applied in case of a singleton FactoryBean. If the FactoryBean instance itself is not kept as singleton, it will be fully created to check the type of its exposed object.
- Overrides:
getTypeForFactoryBean
in classAbstractBeanFactory
- Parameters:
beanName
- the name of the beanmbd
- the merged bean definition for the beanallowInit
- if initialization of the FactoryBean is permitted if the type cannot be determined another way- Returns:
- the type for the bean if determinable, otherwise
ResolvableType.NONE
- See Also:
-
getEarlyBeanReference
Obtain a reference for early access to the specified bean, typically for the purpose of resolving a circular reference.- Parameters:
beanName
- the name of the bean (for error handling purposes)mbd
- the merged bean definition for the beanbean
- the raw bean instance- Returns:
- the object to expose as bean reference
-
applyMergedBeanDefinitionPostProcessors
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) Apply MergedBeanDefinitionPostProcessors to the specified bean definition, invoking theirpostProcessMergedBeanDefinition
methods.- Parameters:
mbd
- the merged bean definition for the beanbeanType
- the actual type of the managed bean instancebeanName
- the name of the bean- See Also:
-
resolveBeforeInstantiation
Apply before-instantiation post-processors, resolving whether there is a before-instantiation shortcut for the specified bean.- Parameters:
beanName
- the name of the beanmbd
- the bean definition for the bean- Returns:
- the shortcut-determined bean instance, or
null
if none
-
applyBeanPostProcessorsBeforeInstantiation
@Nullable protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) Apply InstantiationAwareBeanPostProcessors to the specified bean definition (by class and name), invoking theirpostProcessBeforeInstantiation
methods.Any returned object will be used as the bean instead of actually instantiating the target bean. A
null
return value from the post-processor will result in the target bean being instantiated.- Parameters:
beanClass
- the class of the bean to be instantiatedbeanName
- the name of the bean- Returns:
- the bean object to use instead of a default instance of the target bean, or
null
- See Also:
-
createBeanInstance
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) Create a new instance for the specified bean, using an appropriate instantiation strategy: factory method, constructor autowiring, or simple instantiation.- Parameters:
beanName
- the name of the beanmbd
- the bean definition for the beanargs
- explicit arguments to use for constructor or factory method invocation- Returns:
- a BeanWrapper for the new instance
- See Also:
-
obtainFromSupplier(java.util.function.Supplier<?>, java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition)
instantiateUsingFactoryMethod(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
autowireConstructor(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.reflect.Constructor<?>[], java.lang.Object[])
instantiateBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition)
-
obtainInstanceFromSupplier
@Nullable protected Object obtainInstanceFromSupplier(Supplier<?> supplier, String beanName, RootBeanDefinition mbd) throws Exception Obtain a bean instance from the given supplier.- Parameters:
supplier
- the configured supplierbeanName
- the corresponding bean namembd
- the bean definition for the bean- Returns:
- the bean instance (possibly
null
) - Throws:
Exception
- Since:
- 6.0.7
-
getObjectForBeanInstance
protected Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) Overridden in order to implicitly register the currently created bean as dependent on further beans getting programmatically retrieved during aSupplier
callback.- Overrides:
getObjectForBeanInstance
in classAbstractBeanFactory
- Parameters:
beanInstance
- the shared bean instancename
- the name that may include factory dereference prefixbeanName
- the canonical bean namembd
- the merged bean definition- Returns:
- the object to expose for the bean
- Since:
- 5.0
- See Also:
-
obtainFromSupplier(java.util.function.Supplier<?>, java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition)
-
determineConstructorsFromBeanPostProcessors
@Nullable protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName) throws BeansException Determine candidate constructors to use for the given bean, checking all registeredSmartInstantiationAwareBeanPostProcessors
.- Parameters:
beanClass
- the raw class of the beanbeanName
- the name of the bean- Returns:
- the candidate constructors, or
null
if none specified - Throws:
BeansException
- in case of errors- See Also:
-
instantiateBean
Instantiate the given bean using its default constructor.- Parameters:
beanName
- the name of the beanmbd
- the bean definition for the bean- Returns:
- a BeanWrapper for the new instance
-
instantiateUsingFactoryMethod
protected BeanWrapper instantiateUsingFactoryMethod(String beanName, RootBeanDefinition mbd, @Nullable Object[] explicitArgs) Instantiate the bean using a named factory method. The method may be static, if the mbd parameter specifies a class, rather than a factoryBean, or an instance variable on a factory object itself configured using Dependency Injection.- Parameters:
beanName
- the name of the beanmbd
- the bean definition for the beanexplicitArgs
- argument values passed in programmatically via the getBean method, ornull
if none (implying the use of constructor argument values from bean definition)- Returns:
- a BeanWrapper for the new instance
- See Also:
-
autowireConstructor
protected BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mbd, @Nullable Constructor<?>[] ctors, @Nullable Object[] explicitArgs) "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
- the name of the beanmbd
- the bean definition for the beanctors
- the chosen candidate constructorsexplicitArgs
- argument values passed in programmatically via the getBean method, ornull
if none (implying the use of constructor argument values from bean definition)- Returns:
- a BeanWrapper for the new instance
-
populateBean
Populate the bean instance in the given BeanWrapper with the property values from the bean definition.- Parameters:
beanName
- the name of the beanmbd
- the bean definition for the beanbw
- the BeanWrapper with bean instance
-
autowireByName
protected void autowireByName(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) Fill in any missing property values with references to other beans in this factory if autowire is set to "byName".- Parameters:
beanName
- the name of the bean we're wiring up. Useful for debugging messages; not used functionally.mbd
- bean definition to update through autowiringbw
- the BeanWrapper from which we can obtain information about the beanpvs
- the PropertyValues to register wired objects with
-
autowireByType
protected void autowireByType(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) 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
- the name of the bean to autowire by typembd
- the merged bean definition to update through autowiringbw
- the BeanWrapper from which we can obtain information about the beanpvs
- the PropertyValues to register wired objects with
-
unsatisfiedNonSimpleProperties
Return an array of non-simple bean properties that are unsatisfied. These are probably unsatisfied references to other beans in the factory. Does not include simple properties like primitives or Strings.- Parameters:
mbd
- the merged bean definition the bean was created withbw
- the BeanWrapper the bean was created with- Returns:
- an array of bean property names
- See Also:
-
filterPropertyDescriptorsForDependencyCheck
protected PropertyDescriptor[] filterPropertyDescriptorsForDependencyCheck(BeanWrapper bw, boolean cache) Extract a filtered set of PropertyDescriptors from the given BeanWrapper, excluding ignored dependency types or properties defined on ignored dependency interfaces.- Parameters:
bw
- the BeanWrapper the bean was created withcache
- whether to cache filtered PropertyDescriptors for the given bean Class- Returns:
- the filtered PropertyDescriptors
- See Also:
-
filterPropertyDescriptorsForDependencyCheck
Extract a filtered set of PropertyDescriptors from the given BeanWrapper, excluding ignored dependency types or properties defined on ignored dependency interfaces.- Parameters:
bw
- the BeanWrapper the bean was created with- Returns:
- the filtered PropertyDescriptors
- See Also:
-
isExcludedFromDependencyCheck
Determine whether the given bean property is excluded from dependency checks.This implementation excludes properties defined by CGLIB and properties whose type matches an ignored dependency type or which are defined by an ignored dependency interface.
- Parameters:
pd
- the PropertyDescriptor of the bean property- Returns:
- whether the bean property is excluded
- See Also:
-
checkDependencies
protected void checkDependencies(String beanName, AbstractBeanDefinition mbd, PropertyDescriptor[] pds, @Nullable 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 beanmbd
- the merged bean definition the bean was created withpds
- the relevant property descriptors for the target beanpvs
- the property values to be applied to the bean- Throws:
UnsatisfiedDependencyException
- See Also:
-
applyPropertyValues
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) Apply the given property values, resolving any runtime references to other beans in this bean factory. Must use deep copy, so we don't permanently modify this property.- Parameters:
beanName
- the bean name passed for better exception informationmbd
- the merged bean definitionbw
- the BeanWrapper wrapping the target objectpvs
- the new property values
-
initializeBean
Initialize the given bean instance, applying factory callbacks as well as init methods and bean post processors.Called from
createBean(java.lang.Class<T>)
for traditionally defined beans, and frominitializeBean(java.lang.Object, java.lang.String)
for existing bean instances.- Parameters:
beanName
- the bean name in the factory (for debugging purposes)bean
- the new bean instance we may need to initializembd
- the bean definition that the bean was created with (can also benull
, if given an existing bean instance)- Returns:
- the initialized bean instance (potentially wrapped)
- See Also:
-
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
applyBeanPostProcessorsBeforeInitialization(java.lang.Object, java.lang.String)
invokeInitMethods(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
applyBeanPostProcessorsAfterInitialization(java.lang.Object, java.lang.String)
-
invokeInitMethods
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd) 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.- Parameters:
beanName
- the bean name in the factory (for debugging purposes)bean
- the new bean instance we may need to initializembd
- the merged bean definition that the bean was created with (can also benull
, if given an existing bean instance)- Throws:
Throwable
- if thrown by init methods or by the invocation process- See Also:
-
invokeCustomInitMethod
protected void invokeCustomInitMethod(String beanName, Object bean, RootBeanDefinition mbd, 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.
-
postProcessObjectFromFactoryBean
Applies thepostProcessAfterInitialization
callback of all registered BeanPostProcessors, giving them a chance to post-process the object obtained from FactoryBeans (for example, to auto-proxy them).- Overrides:
postProcessObjectFromFactoryBean
in classFactoryBeanRegistrySupport
- Parameters:
object
- the object obtained from the FactoryBean.beanName
- the name of the bean- Returns:
- the object to expose
- See Also:
-
removeSingleton
Overridden to clear FactoryBean instance cache as well.- Overrides:
removeSingleton
in classFactoryBeanRegistrySupport
- Parameters:
beanName
- the name of the bean- See Also:
-
clearSingletonCache
protected void clearSingletonCache()Overridden to clear FactoryBean instance cache as well.- Overrides:
clearSingletonCache
in classFactoryBeanRegistrySupport
-