|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: REQUIRED | OPTIONAL | DETAIL: ELEMENT | ||||||||
@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.
@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.
Lazy,
Bean,
ComponentScan,
Component
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: REQUIRED | OPTIONAL | DETAIL: ELEMENT | ||||||||