Package org.springframework.context.annotation

# Annotation Interface Primary

@Target({TYPE,METHOD}) @Retention(RUNTIME) @Documented public @interface Primary
Indicates that a bean should be given preference when multiple candidates are qualified to autowire a single-valued dependency. If exactly one 'primary' bean exists among the candidates, it will be the autowired value.

Primary beans only have an effect when finding multiple candidates for single injection points. All type-matching beans are included when autowiring arrays, collections, maps, or ObjectProvider streams.

This annotation is semantically equivalent to the `<bean>` element's `primary` attribute in Spring XML.

May be used on any class directly or indirectly annotated with `@Component` or on methods annotated with @`Bean`.

## Example

     @Component
     public class FooService {

         private FooRepository fooRepository;

         @Autowired
         public FooService(FooRepository fooRepository) {
             this.fooRepository = fooRepository;
         }
     }

     @Component
     public class JdbcFooRepository extends FooRepository {

         public JdbcFooRepository(DataSource dataSource) {
             // ...
         }
     }

     @Primary
     @Component
     public class HibernateFooRepository extends FooRepository {

         public HibernateFooRepository(SessionFactory sessionFactory) {
             // ...
         }
     }

Because `HibernateFooRepository` is marked with `@Primary`, it will be injected preferentially over the jdbc-based variant assuming both are present as beans within the same Spring application context, which is often the case when component-scanning is applied liberally.

Note that using `@Primary` at the class level has no effect unless component-scanning is being used. If a `@Primary`-annotated class is declared via XML, `@Primary` annotation metadata is ignored, and `<bean primary="true|false"/>` is respected instead.

Since:
  3.0
Author:
  Chris Beams, Juergen Hoeller
See Also:
  - `Fallback`
  - `Lazy`
  - `Bean`
  - `ComponentScan`
  - `Component`
  - `BeanDefinition.setPrimary(boolean)`