org.springframework.context.annotation

Annotation Type Primary



  • @Target(value={TYPE,METHOD})
     @Retention(value=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.

    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:
    Lazy, Bean, ComponentScan, Component