Annotation Interface Primary
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: