Skip to content

@Primary和@Qualifier的区别

@Primary@Qualifier 都是 Spring 框架中用于解决 Bean 选择冲突的关键注解,但它们的使用场景和作用方式有所不同。

@Primary

@Primary 注解用于在多个相同类型的 Bean 中指定一个默认的首选 Bean。当 Spring 容器需要根据类型自动装配(如使用 @Autowired)而没有明确指定具体哪个 Bean 时,如果有 Bean 被标记为 @Primary,那么 Spring 将优先选择这个 Bean。

示例:

java
@Service
@Primary
public class DefaultEmailService implements EmailService {
    // ...
}

@Service
public class PremiumEmailService implements EmailService {
    // ...
}

在上述代码中,如果一个类中使用了 @Autowired 来注入 EmailService 的实例,Spring 将会注入 DefaultEmailService,因为它是被标记为 @Primary 的。

@Qualifier

@Qualifier 注解用于在自动装配时提供更具体的 Bean 选择。它允许你通过名称来指定具体要使用的 Bean,从而避免 Spring 自动选择可能带来的不确定性。

示例:

java
@Service("defaultEmailService")
public class DefaultEmailService implements EmailService {
    // ...
}

@Service("premiumEmailService")
public class PremiumEmailService implements EmailService {
    // ...
}

@Component
public class SomeComponent {

    private final EmailService emailService;

    @Autowired
    public SomeComponent(@Qualifier("premiumEmailService") EmailService emailService) {
        this.emailService = emailService;
    }
}

在上面的例子中,即使存在两个 EmailService 的实现,SomeComponent 类中的 emailService 成员变量将被注入 PremiumEmailService,因为通过 @Qualifier("premiumEmailService") 明确指定了这个 Bean。

总结

  • @Primary 是一种策略,用于在多个相同类型的 Bean 中选择一个作为默认 Bean。
  • @Qualifier 是一种机制,用于在装配时指定具体要使用的 Bean,它基于 Bean 的名称进行选择。

两者可以结合使用,也可以单独使用,具体取决于你的需求和场景。