Class QualifierAnnotationAutowireCandidateResolver

All Implemented Interfaces:
Cloneable, Aware, BeanFactoryAware, AutowireCandidateResolver
Direct Known Subclasses:
ContextAnnotationAutowireCandidateResolver

public class QualifierAnnotationAutowireCandidateResolver extends GenericTypeAwareAutowireCandidateResolver
AutowireCandidateResolver implementation that matches bean definition qualifiers against qualifier annotations on the field or parameter to be autowired. Also supports suggested expression values through a value annotation.

Also supports JSR-330's Qualifier annotation if available.

Since:
2.5
Author:
Mark Fisher, Juergen Hoeller, Stephane Nicoll, Sam Brannen
See Also:
  • Constructor Details

    • QualifierAnnotationAutowireCandidateResolver

      public QualifierAnnotationAutowireCandidateResolver()
      Create a new QualifierAnnotationAutowireCandidateResolver for Spring's standard @Qualifier annotation.

      Also supports JSR-330's Qualifier annotation if available.

    • QualifierAnnotationAutowireCandidateResolver

      public QualifierAnnotationAutowireCandidateResolver(Class<? extends Annotation> qualifierType)
      Create a new QualifierAnnotationAutowireCandidateResolver for the given qualifier annotation type.
      Parameters:
      qualifierType - the qualifier annotation to look for
    • QualifierAnnotationAutowireCandidateResolver

      public QualifierAnnotationAutowireCandidateResolver(Set<Class<? extends Annotation>> qualifierTypes)
      Create a new QualifierAnnotationAutowireCandidateResolver for the given qualifier annotation types.
      Parameters:
      qualifierTypes - the qualifier annotations to look for
  • Method Details

    • addQualifierType

      public void addQualifierType(Class<? extends Annotation> qualifierType)
      Register the given type to be used as a qualifier when autowiring.

      This identifies qualifier annotations for direct use (on fields, method parameters and constructor parameters) as well as meta-annotations that in turn identify actual qualifier annotations.

      This implementation only supports annotations as qualifier types. The default is Spring's @Qualifier annotation which serves as a qualifier for direct use and also as a meta-annotation.

      Parameters:
      qualifierType - the annotation type to register
    • setValueAnnotationType

      public void setValueAnnotationType(Class<? extends Annotation> valueAnnotationType)
      Set the 'value' annotation type, to be used on fields, method parameters and constructor parameters.

      The default value annotation type is the Spring-provided @Value annotation.

      This setter property exists so that developers can provide their own (non-Spring-specific) annotation type to indicate a default value expression for a specific argument.

    • isAutowireCandidate

      public boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor)
      Determine whether the provided bean definition is an autowire candidate.

      To be considered a candidate the bean's autowire-candidate attribute must not have been set to 'false'. Also, if an annotation on the field or parameter to be autowired is recognized by this bean factory as a qualifier, the bean must 'match' against the annotation as well as any attributes it may contain. The bean definition must contain the same qualifier or match by meta attributes. A "value" attribute will fall back to match against the bean name or an alias if a qualifier or attribute does not match.

      Specified by:
      isAutowireCandidate in interface AutowireCandidateResolver
      Overrides:
      isAutowireCandidate in class GenericTypeAwareAutowireCandidateResolver
      Parameters:
      bdHolder - the bean definition including bean name and aliases
      descriptor - the descriptor for the target method parameter or field
      Returns:
      whether the bean definition qualifies as autowire candidate
      See Also:
    • checkQualifiers

      protected @Nullable Boolean checkQualifiers(BeanDefinitionHolder bdHolder, Annotation[] annotationsToSearch)
      Match the given qualifier annotations against the candidate bean definition.
      Returns:
      false if a qualifier has been found but not matched, true if a qualifier has been found and matched, null if no qualifier has been found at all
    • isQualifier

      protected boolean isQualifier(Class<? extends Annotation> annotationType)
      Check whether the given annotation type is a recognized qualifier type.
    • checkQualifier

      protected boolean checkQualifier(BeanDefinitionHolder bdHolder, Annotation annotation, TypeConverter typeConverter)
      Match the given qualifier annotation against the candidate bean definition.
    • getQualifiedElementAnnotation

      protected @Nullable Annotation getQualifiedElementAnnotation(RootBeanDefinition bd, Class<? extends Annotation> type)
    • getFactoryMethodAnnotation

      protected @Nullable Annotation getFactoryMethodAnnotation(RootBeanDefinition bd, Class<? extends Annotation> type)
    • isRequired

      public boolean isRequired(DependencyDescriptor descriptor)
      Determine whether the given dependency declares an autowired annotation, checking its required flag.
      Parameters:
      descriptor - the descriptor for the target method parameter or field
      Returns:
      whether the descriptor is marked as required or possibly indicating non-required status some other way (for example, through a parameter annotation)
      See Also:
    • hasQualifier

      public boolean hasQualifier(DependencyDescriptor descriptor)
      Determine whether the given dependency declares a qualifier annotation.
      Parameters:
      descriptor - the descriptor for the target method parameter or field
      Returns:
      whether the descriptor declares a qualifier, narrowing the candidate status beyond the type match
      See Also:
    • getSuggestedName

      public @Nullable String getSuggestedName(DependencyDescriptor descriptor)
      Description copied from interface: AutowireCandidateResolver
      Determine whether a target bean name is suggested for the given dependency (typically - but not necessarily - declared with a single-value qualifier).
      Parameters:
      descriptor - the descriptor for the target method parameter or field
      Returns:
      the qualifier value, if any
    • getSuggestedValue

      public @Nullable Object getSuggestedValue(DependencyDescriptor descriptor)
      Determine whether the given dependency declares a value annotation.
      Parameters:
      descriptor - the descriptor for the target method parameter or field
      Returns:
      the value suggested (typically an expression String), or null if none found
      See Also:
    • findValue

      protected @Nullable Object findValue(Annotation[] annotationsToSearch)
      Determine a suggested value from any of the given candidate annotations.
    • extractValue

      protected Object extractValue(AnnotationAttributes attr)
      Extract the value attribute from the given annotation.
      Since:
      4.3