@Target(value={TYPE,METHOD}) @Retention(value=RUNTIME) @Documented public @interface Primary
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.
 
 @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.
Lazy, 
Bean, 
ComponentScan, 
Component