Spring bean的键作为Map <string,foo> </string,foo>

时间:2013-10-29 14:40:20

标签: java spring spring-mvc

试图在Spring中实例化一个Map我发现了一个奇怪的(对我来说)行为。 我正在使用以下XML来创建Map:

<bean id="fooBean" class="it.arch.fe.util.Foo">
    <property name="prop1" value="val1"></property>
    <property name="prop2" value="val2"></property>
</bean>

<bean id="barBean" class="it.arch.fe.util.Foo">
    <property name="prop1" value="val3"></property>
    <property name="prop2" value="val4"></property>
</bean>

<bean id="mapOfFoos" class="org.springframework.beans.factory.config.MapFactoryBean">
    <property name="targetMapClass">
        <value>java.util.HashMap</value>
    </property>
    <property name="sourceMap">
        <map>
            <entry key="foo" value-ref="fooBean" />
            <entry key="bar" value-ref="barBean" />
        </map>
    </property>
</bean>

我设法在我的代码中实例化和自动化这个Map,但是我遇到了关键问题:

我想要一张带有“foo”和“bar”键的地图,但它们似乎是“fooBean”和“barBean”。

这应该发生吗? 有没有办法使用“键”属性作为键,因为它似乎是明显的行为?

(我不想将bean的名称更改为foo和bar,因为我已经声明了两个带有这些名称的bean,我想要遵循的逻辑需要键是“foo”和“bar” )

编辑:从Trever Shick的回答开始,我找到了解决实际问题的方法,但我仍然试图理解为什么会发生这种情况。

2 个答案:

答案 0 :(得分:2)

只使用地图,不要使用MapFactoryBean作为mapOfFoos

<beans xmlns:util="http://www.springframework.org/schema/" xsi:schemaLocation="http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

<util:map id="mapOfFoos">
    <entry key="foo" value-ref="fooBean" />
    <entry key="bar" value-ref="barBean" />
</util:map>

答案 1 :(得分:0)

因为我发现我无法将Map本身实例化为没有MapFactoryBean的bean或另一个bean中的属性,我以另一种方式解决了这个问题:

我使用属性prop1和prop2创建了另一个类InnerFoo,在那里我放置了我在前一个Foo中的属性,所以现在我的Map<String,InnerFoo>是Foo的唯一属性,这是我的xml片段:

<bean id="fooBean" class="it.arch.fe.util.InnerFoo">
    <property name="prop1" value="val1"></property>
    <property name="prop2" value="val2"></property>
</bean>

<bean id="barBean" class="it.arch.fe.util.InnerFoo">
    <property name="prop1" value="val3"></property>
    <property name="prop2" value="val4"></property>
</bean>

<bean id="mapOfFoos" class="it.arch.fe.util.Foo">
    <property name="mapping">
        <map>
            <entry key="foo" value-ref="fooBean" />
            <entry key="bar" value-ref="barBean" />
        </map>
    </property>     
</bean>