我认为两种方式之间没有任何区别,@ 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注释,该注释在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关.
我遇到了@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名称相同的变量名称,但是偶然有一些其他变量名称并且遇到了这个问题.
如果有任何疑问,请告诉我.
| 归档时间: |
|
| 查看次数: |
32599 次 |
| 最近记录: |