2016-07-05 106 views
0

我有一个与Spring注释相关的问题。在我的(学习)项目中,我定义了两个类,另一个类有两个属性,每个属性都是其中的一个。 为了生成错误,我在XML中定义了两个相同类类型的bean,并且我在setter方法中使用了@Autowired注释。事情是这样的:Spring名称注释

<bean id="classA" class="beans.ClassA"></bean> 
<bean id="otherclassA" class="beans.ClassA"></bean> 
<bean id="classB" class="beans.ClassB"></bean> 
public class UpperClass{ 
    private ClassA classA; 
    private ClassB classB; 

    @Autowired 
    public void setClassA(ClassA classA){this.classA = classA} 
    @Autowired 
    public void setClassB(ClassB classB){this.classB = classB} 

    /* . 
     . 
     . 
    */ 
} 

在主类中,我得到的ApplicationContext这个bean的实例,并打印属性重写toString方法,一个简单的测试内容。 我读过Spring Autowired注释按类型查找bean,所以测试应该失败,因为定义了两个ClassA类的bean,但是它起作用。 它也可以使用@Resource注释而不使用任何名称。

我正在使用Spring版本4. 我已经将bean的id更改为与类/ setters名称不匹配,并且如预期的那样失败。

谁能告诉我为什么,或者我做错了什么? 如果Spring无法通过类型找到bean,Spring是否正在寻找byName?

+0

尝试更改xml中第一个bean的id并查看会发生什么。 – Jason

+0

我已经看到,如果更改类而不是bean ID,则必须更改setter参数的名称以获取错误,您还必须更改setter方法名称以使其与bean id不匹配。 – jgonzal

回答

0

当有多个bean匹配所需类型时,Spring将查看方法参数名称以解决歧义。海事组织是非常神奇的,也是避免@Autowired的另一个原因。如果你最终使用(或者不得不处理别人的使用)这个行为,IntelliJ的Spring插件在搞清楚在一个自动装配站点实际注入哪个bean会做很好的工作。

+0

“@ Autowired”的建议选择是什么? – Andreas

+0

XML配置,当然。清晰度胜过简洁。 –

+0

@Andreas您可以使用@ Qualifier解决歧义 – hellojava