0

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

<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 的回答开始,我找到了解决实际问题的方法,但我仍在试图了解为什么会发生这种情况。

4

2 回答 2

2

只使用地图,不要为您的 mapOfFoos 使用 MapFactoryBean

<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>
于 2013-10-29T14:44:07.240 回答
0

由于我发现我无法将 Map 本身实例化为没有 MapFactoryBean 的 bean 或作为另一个 bean 内的属性,我以另一种方式解决:

我创建了另一个类,InnerFoo,其属性为 prop1 和 prop2,我在其中放置了之前 Foo 中的属性,所以现在 myMap<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>
于 2013-10-29T16:00:39.897 回答