org.springframework.context.annotation

## Annotation Type Primary

    @Target(value={TYPE,METHOD})
    @Retention(value=RUNTIME)
    @Inherited
    @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. 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 {
         public JdbcFooService(DataSource dataSource) {
             // ...
         }
     }

     @Primary
     @Component
     public class HibernateFooRepository {
         public HibernateFooService(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
See Also:
  `Lazy`, `Bean`, `ComponentScan`, `Component`