@Qualifier和@Resource之间的区别

卢声远*_* Lu 40 java spring

我认为两种方式之间没有任何区别,@ Qualifier总是与@Autowired一起使用.

@Autowired
@Qualifier("alpha")
Run Code Online (Sandbox Code Playgroud)

VS

@Resource(name="alpha")
Run Code Online (Sandbox Code Playgroud)

有谁能让我知道区别?谢谢!

Ken*_*han 67

@Autowired可以单独使用.如果单独使用,它将按类型连接.因此,如果在容器中声明了多个相同类型的bean,则会出现问题,因为@Autowired不知道要使用哪个bean来注入.因此,通过指定bean名称(按名称连接)@Qualifier一起使用@Autowired以明确实际连接的bean

@Resource也是按名称连线的.因此,如果@Autowired与之一起使用@Qualifier,则与之相同@Resource.

的差是@Autowired@Qualifier是弹簧注释而@Resource是标准Java注解(从JSR-250).此外,@Resource 只支持字段和setter注入,同时 @Autowired支持字段,setter,构造函数和多参数方法注入.

建议@Resource用于字段和setter注入.坚持使用@Qualifier@Autowired构造函数或多参数方法注入.

看到这个:

如果您打算按名称表达注释驱动的注入,请不要主要使用@Autowired - 即使技术上能够通过@Qualifier值引用bean名称.相反,更喜欢JSR-250 @Resource注释,该注释在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关.


Abh*_*pta 5

我遇到了@Autowired的一些问题,然后开始使用@Qualifier,当我定义了多个相同类型的bean时,我终于能够找到何时使用@Autowired和@Qualifier.

假设您定义了两个相同类型但不同值的bean:

<bean id="appContext1" class="com.context.AppContext">
     <constructor-arg value="abc" />
<bean/>
<bean id="appContext2" class="com.context.AppContext">
     <constructor-arg value="ABC" />
<bean/>
Run Code Online (Sandbox Code Playgroud)

然后,如果您只是尝试使用@Autowire,那么您必须使用与bean名称相同的变量名称,否则它将在找到多个类型时给出错误.

@Autowired
AppContext appContext;
Run Code Online (Sandbox Code Playgroud)

对于上述用例,您必须使用限定符.

@Autowired
@Qualifier("appContext1")
AppContext appContext;
Run Code Online (Sandbox Code Playgroud)

相反,如果使用与bean名称相同的变量名称,则可以省去@Qualifier的使用.

@Autowired
AppContext appContext1;
Run Code Online (Sandbox Code Playgroud)

我总是使用与bean名称相同的变量名称,但是偶然有一些其他变量名称并且遇到了这个问题.

如果有任何疑问,请告诉我.