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`