Class AutowiredAnnotationBeanPostProcessor
- All Implemented Interfaces:
BeanRegistrationAotProcessor,Aware,BeanFactoryAware,BeanPostProcessor,InstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor,MergedBeanDefinitionPostProcessor,Ordered,PriorityOrdered
BeanPostProcessor
implementation that autowires annotated fields, setter methods, and arbitrary
config methods. Such members to be injected are detected through annotations:
by default, Spring's @Autowired and @Value
annotations.
Also supports the common @Inject annotation,
if available, as a direct alternative to Spring's own @Autowired.
Additionally, it retains support for the javax.inject.Inject variant
dating back to the original JSR-330 specification (as known from Java EE 6-8).
Autowired Constructors
Only one constructor of any given bean class may declare this annotation with
the 'required' attribute set to true, indicating the constructor
to autowire when used as a Spring bean. Furthermore, if the 'required' attribute
is set to true, only a single constructor may be annotated with
@Autowired. If multiple non-required constructors declare the
annotation, they will be considered as candidates for autowiring. The constructor
with the greatest number of dependencies that can be satisfied by matching beans
in the Spring container will be chosen. If none of the candidates can be satisfied,
then a primary/default constructor (if present) will be used. If a class only
declares a single constructor to begin with, it will always be used, even if not
annotated. An annotated constructor does not have to be public.
Autowired Fields
Fields are injected right after construction of a bean, before any config methods are invoked. Such a config field does not have to be public.
Autowired Methods
Config methods may have an arbitrary name and any number of arguments; each of those arguments will be autowired with a matching bean in the Spring container. Bean property setter methods are effectively just a special case of such a general config method. Config methods do not have to be public.
Annotation Config vs. XML Config
A default AutowiredAnnotationBeanPostProcessor will be registered
by the "context:annotation-config" and "context:component-scan" XML tags.
Remove or turn off the default annotation configuration there if you intend
to specify a custom AutowiredAnnotationBeanPostProcessor bean definition.
NOTE: Annotation injection will be performed before XML injection; thus the latter configuration will override the former for properties wired through both approaches.
@Lookup Methods
In addition to regular injection points as discussed above, this post-processor
also handles Spring's @Lookup annotation which identifies lookup
methods to be replaced by the container at runtime. This is essentially a type-safe
version of getBean(Class, args) and getBean(String, args).
See @Lookup's javadoc for details.
- Since:
- 2.5
- Author:
- Juergen Hoeller, Mark Fisher, Stephane Nicoll, Sebastien Deleuze, Sam Brannen, Phillip Webb
- See Also:
-
Field Summary
FieldsFields inherited from interface org.springframework.beans.factory.aot.BeanRegistrationAotProcessor
IGNORE_REGISTRATION_ATTRIBUTEFields inherited from interface org.springframework.core.Ordered
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE -
Constructor Summary
ConstructorsConstructorDescriptionCreate a newAutowiredAnnotationBeanPostProcessorfor Spring's standard@Autowiredand@Valueannotations. -
Method Summary
Modifier and TypeMethodDescriptionClass<?>determineBeanType(Class<?> beanClass, String beanName) Determine the type of the bean to be eventually returned from this processor'sInstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String)callback.Constructor<?>[]determineCandidateConstructors(Class<?> beanClass, String beanName) Determine the candidate constructors to use for the given bean.protected booleanDetermine if the annotated field or method requires its dependency.intgetOrder()Get the order value of this object.voidpostProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) Post-process the given merged bean definition for the specified bean.postProcessProperties(PropertyValues pvs, Object bean, String beanName) Post-process the given property values before the factory applies them to the given bean.processAheadOfTime(RegisteredBean registeredBean) Process the givenRegisteredBeaninstance ahead-of-time and return a contribution ornull.voidprocessInjection(Object bean) Native processing method for direct calls with an arbitrary target instance, resolving all of its fields and methods which are annotated with one of the configured 'autowired' annotation types.voidresetBeanDefinition(String beanName) A notification that the bean definition for the specified name has been reset, and that this post-processor should clear any metadata for the affected bean.voidsetAutowiredAnnotationType(Class<? extends Annotation> autowiredAnnotationType) Set the 'autowired' annotation type, to be used on constructors, fields, setter methods, and arbitrary config methods.voidsetAutowiredAnnotationTypes(Set<Class<? extends Annotation>> autowiredAnnotationTypes) Set the 'autowired' annotation types, to be used on constructors, fields, setter methods, and arbitrary config methods.voidsetBeanFactory(BeanFactory beanFactory) Callback that supplies the owning factory to a bean instance.voidsetOrder(int order) voidsetRequiredParameterName(String requiredParameterName) Set the name of an attribute of the annotation that specifies whether it is required.voidsetRequiredParameterValue(boolean requiredParameterValue) Set the boolean value that marks a dependency as required.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.springframework.beans.factory.config.BeanPostProcessor
postProcessAfterInitialization, postProcessBeforeInitializationMethods inherited from interface org.springframework.beans.factory.aot.BeanRegistrationAotProcessor
isBeanExcludedFromAotProcessingMethods inherited from interface org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
postProcessAfterInstantiation, postProcessBeforeInstantiationMethods inherited from interface org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor
getEarlyBeanReference, predictBeanType
-
Field Details
-
logger
-
-
Constructor Details
-
AutowiredAnnotationBeanPostProcessor
public AutowiredAnnotationBeanPostProcessor()Create a newAutowiredAnnotationBeanPostProcessorfor Spring's standard@Autowiredand@Valueannotations.Also supports the common
@Injectannotation, if available, as well as the originaljavax.inject.Injectvariant.
-
-
Method Details
-
setAutowiredAnnotationType
Set the 'autowired' annotation type, to be used on constructors, fields, setter methods, and arbitrary config methods.The default autowired annotation types are the Spring-provided
@Autowiredand@Valueannotations as well as the common@Injectannotation, if available.This setter property exists so that developers can provide their own (non-Spring-specific) annotation type to indicate that a member is supposed to be autowired.
-
setAutowiredAnnotationTypes
Set the 'autowired' annotation types, to be used on constructors, fields, setter methods, and arbitrary config methods.The default autowired annotation types are the Spring-provided
@Autowiredand@Valueannotations as well as the common@Injectannotation, if available.This setter property exists so that developers can provide their own (non-Spring-specific) annotation types to indicate that a member is supposed to be autowired.
-
setRequiredParameterName
Set the name of an attribute of the annotation that specifies whether it is required.- See Also:
-
setRequiredParameterValue
public void setRequiredParameterValue(boolean requiredParameterValue) Set the boolean value that marks a dependency as required.For example if using 'required=true' (the default), this value should be
true; but if using 'optional=false', this value should befalse.- See Also:
-
setOrder
public void setOrder(int order) -
getOrder
public int getOrder()Description copied from interface:OrderedGet the order value of this object.Higher values are interpreted as lower priority. As a consequence, the object with the lowest value has the highest priority (somewhat analogous to Servlet
load-on-startupvalues).Same order values will result in arbitrary sort positions for the affected objects.
-
setBeanFactory
Description copied from interface:BeanFactoryAwareCallback that supplies the owning factory to a bean instance.Invoked after the population of normal bean properties but before an initialization callback such as
InitializingBean.afterPropertiesSet()or a custom init-method.- Specified by:
setBeanFactoryin interfaceBeanFactoryAware- Parameters:
beanFactory- owning BeanFactory (nevernull). The bean can immediately call methods on the factory.- See Also:
-
postProcessMergedBeanDefinition
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) Description copied from interface:MergedBeanDefinitionPostProcessorPost-process the given merged bean definition for the specified bean.- Specified by:
postProcessMergedBeanDefinitionin interfaceMergedBeanDefinitionPostProcessor- Parameters:
beanDefinition- the merged bean definition for the beanbeanType- the actual type of the managed bean instancebeanName- the name of the bean- See Also:
-
resetBeanDefinition
Description copied from interface:MergedBeanDefinitionPostProcessorA notification that the bean definition for the specified name has been reset, and that this post-processor should clear any metadata for the affected bean.The default implementation is empty.
- Specified by:
resetBeanDefinitionin interfaceMergedBeanDefinitionPostProcessor- Parameters:
beanName- the name of the bean- See Also:
-
processAheadOfTime
Description copied from interface:BeanRegistrationAotProcessorProcess the givenRegisteredBeaninstance ahead-of-time and return a contribution ornull.Processors are free to use any techniques they like to analyze the given instance. Most typically use reflection to find fields or methods to use in the contribution. Contributions typically generate source code or resource files that can be used when the AOT optimized application runs.
If the given instance isn't relevant to the processor, it should return a
nullcontribution.- Specified by:
processAheadOfTimein interfaceBeanRegistrationAotProcessor- Parameters:
registeredBean- the registered bean to process- Returns:
- a
BeanRegistrationAotContributionornull
-
determineBeanType
Description copied from interface:SmartInstantiationAwareBeanPostProcessorDetermine the type of the bean to be eventually returned from this processor'sInstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String)callback.The default implementation returns the given bean class as-is. Specific implementations should fully evaluate their processing steps in order to create/initialize a potential proxy class upfront.
- Specified by:
determineBeanTypein interfaceSmartInstantiationAwareBeanPostProcessor- Parameters:
beanClass- the raw class of the beanbeanName- the name of the bean- Returns:
- the type of the bean (never
null) - Throws:
BeanCreationException
-
determineCandidateConstructors
@Nullable public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeanCreationException Description copied from interface:SmartInstantiationAwareBeanPostProcessorDetermine the candidate constructors to use for the given bean.The default implementation returns
null.- Specified by:
determineCandidateConstructorsin interfaceSmartInstantiationAwareBeanPostProcessor- Parameters:
beanClass- the raw class of the bean (nevernull)beanName- the name of the bean- Returns:
- the candidate constructors, or
nullif none specified - Throws:
BeanCreationException
-
postProcessProperties
Description copied from interface:InstantiationAwareBeanPostProcessorPost-process the given property values before the factory applies them to the given bean.The default implementation returns the given
pvsas-is.- Specified by:
postProcessPropertiesin interfaceInstantiationAwareBeanPostProcessor- Parameters:
pvs- the property values that the factory is about to apply (nevernull)bean- the bean instance created, but whose properties have not yet been setbeanName- the name of the bean- Returns:
- the actual property values to apply to the given bean (can be the passed-in
PropertyValues instance), or
nullto skip property population
-
processInjection
Native processing method for direct calls with an arbitrary target instance, resolving all of its fields and methods which are annotated with one of the configured 'autowired' annotation types.- Parameters:
bean- the target instance to process- Throws:
BeanCreationException- if autowiring failed- See Also:
-
determineRequiredStatus
Determine if the annotated field or method requires its dependency.A 'required' dependency means that autowiring should fail when no beans are found. Otherwise, the autowiring process will simply bypass the field or method when no beans are found.
- Parameters:
ann- the Autowired annotation- Returns:
- whether the annotation indicates that a dependency is required
-