2011-03-01 30 views
7
<bean id="cObject" scope="request" class="x.y.z.CClass"/> 
<bean id="bObject" scope="request" class="x.y.z.BClass"/> 
<bean id="aObject" scope="request" class="x.y.z.AClass"> 
    <constructor-arg ref="bObject" /> 
    <property name="cRef" ref="cObject" /> 
</bean> 

aObject.cRef由於某種原因沒有得到設置。請注意,constructor-arg和property在相同的定義中使用。我還沒有看到具有類似功能的示例/帖子。constructor-arg和bean定義中的屬性

+2

哪個版本的Spring? Spring 3.0.5對我來說工作得很好。另外,嘗試設置一個或另一個。我的猜測是你的問題與混合property和constructor-arg無關。 – Damien 2011-03-01 03:47:20

+1

這個語法很好。你確定你沒有試圖在構造函數的*裏使用'cRef',因爲它不會被這個點設置。 – skaffman 2011-03-01 09:56:28

+0

從一個bean的單個小寫字母開始,可能會給Spring,Jackson和其他依賴於bean規範的人帶來麻煩。如果您將該屬性更改爲myCRef,它是否解決了該問題? – Hazok 2016-02-22 21:35:33

回答

2

混合<constructor-arg><property>通常是一個壞主意。

使用<constructor-arg>只有一個很好的理由,那就是創建不可變的對象。

但是,如果您可以設置其屬性,則您的對象不是不可變的。請勿使用<constructor-arg>。重新設計類,如果您需要在創建bean時應用一些邏輯,請使用註釋爲@PostConstruct的初始化方法。

+0

這很有道理。 通過使用autowire =「byName」和屬性進行修復。不知何故,當struts實例化bean時,它並未使用自定義構造函數調用bean。這種修復更加可取。 – anthos 2011-03-02 04:46:42

2

在同一消息來源,我的同事發現:

Caused by: org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'service.MenuService#0' 
    defined in class path resource [spring-beans/integrator.xml]: 
    Could not resolve matching constructor (hint: specify index/type/name 
    arguments for simple parameters to avoid type ambiguities) 

,而我的主人,測試和生產服務器有沒有這樣的錯誤。

有了:

<bean class="service.MenuService"> 
    <constructor-arg index="0" type="java.lang.String" value="#{user}"/> 
    <constructor-arg index="1" type="java.lang.String" value="#{password}"/> 
    <constructor-arg index="2" type="java.lang.String" value="#{uri}"/> 
    <property name="system" value="OPRT"/> 
    <property name="client" value="OPRT"/> 
</bean> 

同時也有隻有一個豆3參數的構造。

使用構造函數的原因 - 它通過調用init()方法在非Spring庫上執行一些其他操作。並將args設置爲字段。

所以我改變spring-beans.xml到:

<bean class="service.MenuService" init-method="init"> 
    <property name="login" value="#{user}"/> 
    <property name="password" value="#{password}"/> 
    <property name="httpsUrl" value="#{uri}"/> 
    <property name="system" value="OPRT" /> 
    <property name="client" value="OPRT" /> 
</bean> 

以關注init-method=一部分。

UPDATE畢竟我寫了簡單的XML配置,並在調試器中通過Spring源代碼。似乎與春天3.X有可能構造 - 精氨酸財產在XML 定義組合(檢查doCreateBeanAbstractAutowireCapableBeanFactory.java,其中要求createBeanInstancepopulateBean下一個)。

另請參見https://softwareengineering.stackexchange.com/questions/149378/both-constructor-and-setter-injection-together-in-spring/

相關問題