@Qualifier("beanName") 和 @Component("beanName") 的区别

Posted

技术标签:

【中文标题】@Qualifier("beanName") 和 @Component("beanName") 的区别【英文标题】:Difference between @Qualifier("beanName") and @Component("beanName") 【发布时间】:2019-05-26 07:22:13 【问题描述】:

使用 @Qualifier("beanName")@Component("beanName") 有什么区别吗? 如果没有,是否有首选方法?

【问题讨论】:

【参考方案1】:

它们完全是两种不同的东西,听起来你在和我比较苹果和橙子。

@Component 用于将类声明为 Spring bean,而 @Qualifier 则无法做到这一点。

@Qualifier 旨在帮助 Spring 在有超过 1 个符合条件的 bean 进行注入时确定要注入的 bean。它通常与@Autowired 一起使用,它对注入点增加了更多约束,使得其中只能注入一个bean。

【讨论】:

【参考方案2】:

通常,您在组件上使用@Component("beanName"),在您正在自动装配的类上使用@Qualifier("beanName")。例

@Component("myComponent1")
public class MyComponent1 implements MyComponent 
....



@Component("myComponent2")
public class MyComponent2 implements MyComponent 
....



@Service
public class SomeService implements MyService 

    @Qualifier("myComponent1")
    private MyComponent myComponent;

    ...


如果 bean/component 有多个实现,spring 将不知道选择哪个 bean,因此您需要使用限定符来指定哪个是正确的。

此外,您可以在其中一个组件上使用@Primary,因此默认情况下始终选中它。

【讨论】:

以上是关于@Qualifier("beanName") 和 @Component("beanName") 的区别的主要内容,如果未能解决你的问题,请参考以下文章

@Qualifier、@Priority、@Primary简介

java中@Qualifier("string")是啥用法?

spring设计模式之applicationContext.getBean("beanName")思想

spring设计模式之applicationContext.getBean("beanName")思想

从头认识Spring-2.3 注解装配-@autowired-限定器@Qualifier

为啥 Application.Wait 会出现编译错误:“Invalid Qualifier”