2010-10-13 202 views
3

我有以下定義。Spring @Autowired與2個相同類型的豆

@Autowired 
DaoType1<object1> someDao; 

@Autowired 
DaoType1<object1> someListDao; 

,在我的bean定義我有相同的類型

<bean id="someDao" class="com.example.DaoType1" /> 
<bean id="someListDao" class="com.example.DaoType1" /> 

第二豆是從另一個XML文件中導入兩種豆子,如果有差別。他們也有不同的屬性。爲什麼spring不會拋出錯誤,因爲已經定義了2個相同類型的bean。它是否使用變量名稱,因爲它們與bean ID匹配。 dao是不同的,如果我已經爲兩個不同的bean使用了@Qualifiers,那麼功能就會按預期工作。

這是一個更簡潔的版本。我忽略了其他豆類,因爲它們不相關。

的applicationContext.xml

<import resource="classpath:dm-services-crud.xml"/> 
<bean id="ruleListCrudService" class="com.idna.dm.service.crud.impl.RuleCrudServiceImpl"> 
    <property name="crudDao" ref="ruleListCrudDao" /> 
</bean> 

DM-服務,crud.xml

<bean id="ruleCrudService" class="com.idna.dm.service.crud.impl.RuleCrudServiceImpl"> 
     <property name="crudDao" ref="ruleCrudDao" /> 
     <property name="ruleNetworkOfNodesCrudService" ref="ruleNetworkOfNodesCrudService" /> 
     <property name="elementMappingsCrudService" ref="elementMappingsCrudService" /> 
     <property name="ruleCrudDao" ref="newRuleCrudDao"/> 
    </bean> 

默認自動裝配不存在任何的我的XML文件在所有。

+1

嗯,我預料會失敗。畢竟,它可能會使用字段名稱。這就是'@ Resource'所做的,所以這是一致的。 – skaffman 2010-10-13 16:09:17

+0

能否顯示整個'applicationContext.xml'(兩者)? – Bozho 2010-10-13 20:13:07

回答

8

這似乎是預期的行爲。該documentation說:

綽號

自動裝配屬性名稱。 Spring會查找與需要自動裝配的屬性同名的bean。例如,如果一個bean定義被設置爲autowire的名稱,並且它包含一個主屬性(也就是說,它有一個setMaster(..)方法),Spring會查找一個名爲master的bean定義,並使用它來設置屬性。

我想這意味着你已經在applicationContext.xml中指定了default-autowire="byName"

但是,重構可能會以不可預測的方式影響這一點。這就是爲什麼(我認爲),建議按類型切換到自動裝配,並通過使用

  • @Qualifier歧義豆(正如你指出)
  • @Resource而不是@Autowired(如skaffman說明)
+0

我明白,所以我想知道爲什麼這個工程。儘管我已經將代碼製作爲通用代碼,但我們目前正在運行此代碼,而不會在我們的實時服務器上出現問題 – DeliveryNinja 2010-10-13 16:30:31

+0

看到我的peraphrased最後一段 – Bozho 2010-10-13 16:33:40

+0

簡短的回答:它不工作。春天正在解決它認爲合適的甘露中的自動裝配。目前,這與您所需的功能相匹配。你確實有一個潛在的不明確之處,你應該按照Bozho的描述來解決它。 – DwB 2010-10-13 16:36:59

1

@Autowired註釋的行爲與基於xml的bean定義中的「autowire by type」規範略有不同。

當使用註釋時,你在技術上不是在做一個汽車線......你正在根據註釋設置值。自動裝配註釋具有與xml屬性元素相同的功能。