2012-07-02 118 views
2

我希望能夠通過引用將bean ID傳遞給另一個bean。所以,如果我有這樣的:如何將Spring bean id注入到另一個Spring配置Bean中?

<bean id="specialName" class="my.SpecialBean"/> 
<bean id="referenceBean" class="my.ReferenceBean"> 
    <property name="refId" value="<specialName.name>"/> 
</bean> 

public class ReferenceBean { 

    // The spring injected value of this should be 'specialName'   
    public String refId; 

    // getter & setter for refId 
} 

我之所以需要這個,重要的是ReferenceBean實際上是在駱駝的路線建設者,並將其引導信息通過Spring註冊表以SpecialBean。我是新來的春天和駱駝,所以如果這是一個不健全的問題,我的道歉。

回答

2

。您可以使用Spring-EL -

<bean id="specialName" class="my.SpecialBean"/> 
<bean id="referenceBean" class="my.ReferenceBean"> 
    <property name="refId" value="#{specialName.name}"/> 
</bean> 
+0

我剛剛發現了這個。謝謝你的幫助! – Spina

+0

當我嘗試這樣做時,我得到一個org.springframework.expression.spel.SpelEvaluationException:EL1008E :(pos 13):無法在類型對象上找到字段或屬性「name」(...) – cfinley

0

什麼:

<bean id="specialName" class="my.SpecialBean" /> 
<bean id="referenceBean" class="my.ReferenceBean"> 
    <property name="refId" ref="specialName" /> 
</bean> 

這樣你的bean應注射(只要你改變字符串屬性在my.SpecialBean

然後你就可以得到任何您想要的屬性

+0

這不會出現在我的環境下工作。我得到一個類似這樣的文本的異常:BeanCreationException:創建名爲'referenceBean'的bean時出錯...無法將屬性'my.SpecialBean'的屬性值轉換爲屬性'refId'所需的類型'java.lang.String'。我認爲問題在於refId的類型是String,但我正在分配一個my.SpecialBean類型的對象。 – Spina

+0

是的,這就是'提供您更改my.SpecialBean'中的字符串屬性的原因^^ –

+0

我明白,如果您想在駱駝路由中使用bean id,注入bean沒有意義。那麼爲什麼不簡單地像我上面提出的那樣注入bean id呢? –

2

爲什麼不只是把id stati卡利到那裏的refId?它不會改變,那麼爲什麼你要在這裏做一些複雜的事情?

<bean id="specialName" class="my.SpecialBean"/> 
<bean id="referenceBean" class="my.ReferenceBean"> 
    <property name="refId" value="specialName"/> 
</bean> 
+0

您的建議是我最初的方法。我喜歡它,因爲它簡單明瞭。但是,當我更改一個bean ID時,我不想冒着忘記更新ReferenceBean的風險。理想的解決方案會導致Spring xml驗證失敗。不太理想的解決方案會導致Spring在啓動時失敗。您所提供的解決方案只有在穿越駱駝路線後纔會失敗。 – Spina

+0

好的..如果你想春天失敗,如果你改變其中的一個,那麼從Biju上面的解決方案更好。 –

0

您可以使用idref元素(見Spring XML Beans Schema):

<bean id="specialName" class="my.SpecialBean"/> 
<bean id="referenceBean" class="my.ReferenceBean"> 
    <property name="refId"> 
     <idref bean="specialName"/> 
    </property> 
</bean>