注释类型 Primary
@Target({TYPE,METHOD}) @Retention(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'sprimary
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.- 从以下版本开始:
- 3.0
- 作者:
- Chris Beams
- 另请参阅:
Lazy
,Bean
,ComponentScan
,Component