2012-07-02 83 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>