在 spring boot 中,当存在多个同类型的 bean 时,使用 @primary 注解可以指定优先注入的 bean。只需在候选 bean 类上添加 @primary,spring 容器在进行按类型自动装配时会优先选择该 bean,从而解决歧义。

如何配置多个同类型 Bean 并标记优先级
通过定义两个实现相同接口的 Bean,并在其中一个上使用 @Primary,即可确立其优先地位。Spring 容器在初始化上下文时,会扫描所有候选 Bean,若发现带有 @Primary 的 Bean,则将其作为默认注入目标。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class PrimaryConfig {
@Bean
@Primary
public MessageService primaryService() {
return new PrimaryMessageService();
}
@Bean
public MessageService secondaryService() {
return new SecondaryMessageService();
}
}
当 @Primary 与 @Qualifier 同时使用时以谁为准
当 @Primary 与 @Qualifier 同时存在时,@Qualifier 具有更高的优先级。如果注入点明确指定了 @Qualifier,Spring 将忽略 @Primary 而直接查找匹配的 Bean;若未指定限定符,则回退到 @Primary 的逻辑。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 忽略 @Primary,强制注入名为 "secondary" 的 Bean
@Autowired
@Qualifier("secondaryService")
private MessageService messageService;
}
如果所有同类型 Bean 都未标注 @Primary 会发生什么
如果多个同类型 Bean 均未使用 @Primary,且注入点未使用 @Qualifier 指定具体名称,Spring 容器在启动时将抛出 NoUniqueBeanDefinitionException 异常。这是因为容器无法确定应该注入哪一个 Bean,必须通过添加 @Primary 或 @Qualifier 来消除歧义。


















