@Primary用于解决多Bean注入歧义,当同一类型存在多个Bean时指定默认注入的首选Bean;它作用于@Component类或@Bean方法,优先级低于@Qualifier但高于名称匹配,且同一类型仅允许一个@Primary。

@Primary 是 Spring 提供的一个注解,用于在多个相同类型的 Bean 存在时,**指定其中一个作为首选(默认)注入的 Bean**。它不改变 Bean 的创建逻辑,只影响依赖注入时的自动装配(@Autowired)行为。
什么时候需要 @Primary?
当你的项目中定义了多个类型相同的 Bean(比如多个 DataSource、多个 RestTemplate 或自定义服务接口的多个实现),Spring 无法凭类型唯一确定该注入哪一个,就会报错:NoUniqueBeanDefinitionException。这时可以用 @Primary 明确“默认选这个”。
怎么用 @Primary?
只需在目标 Bean 的定义处(类上或 @Bean 方法上)添加 @Primary 注解即可:
- 对
@Component类:加在类上 - 对
@Bean方法:加在方法上
示例:
立即学习“Java免费学习笔记(深入)”;
@Component
@Primary
public class RedisCacheService implements CacheService {
// 默认被注入的实现
}
@Component
public class LocalCacheService implements CacheService {
// 不加 @Primary,不会被默认注入
}
@Service
public class OrderService {
@Autowired
private CacheService cacheService; // 自动注入 RedisCacheService
}
@Primary 和 @Qualifier 怎么配合?
@Primary 解决“默认选谁”,@Qualifier 解决“明确选谁”。两者不冲突,可以共存:
- 没写
@Qualifier→ 按@Primary注入 - 写了
@Qualifier("xxx")→ 忽略@Primary,按名字匹配
例如:
@Bean
@Primary
public RestTemplate defaultRestTemplate() { ... }
@Bean
@Qualifier("internalRestTemplate")
public RestTemplate internalRestTemplate() { ... }
// 使用
@Autowired private RestTemplate restTemplate; // 注入 defaultRestTemplate
@Autowired @Qualifier("internalRestTemplate")
private RestTemplate internalRestTemplate; // 明确注入 internalRestTemplate
注意事项
- 一个类型下最多只能有一个
@PrimaryBean,否则启动报错 -
@Primary优先级高于@Bean方法名匹配,但低于@Qualifier - 如果用了构造器注入且有多个参数,每个同类型参数都可能受
@Primary影响,需谨慎 - 不推荐在多个
@Configuration类中分散定义同类型@PrimaryBean,易引发冲突


















