【问题标题】:Keys of Spring beans as Map<String,Foo>Spring bean 的键为 Map<String,Foo>
【发布时间】:2013-11-08 18:57:18
【问题描述】:

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

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    只使用地图,不要为您的 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>
    

    【讨论】:

    • 感谢您的回答,我正在努力让您的 sn-p 工作,但“map”标签似乎不支持“id”键。我应该将整个 .. 放在“bean”标签中吗?
    • 好的,我研究了更多,似乎我不能仅仅实例化一张地图。它必须在 MapFactoryBean 内或作为另一个 bean 内的属性。你建议后者吗?
    • 感谢您的输入,现在我也尝试使用 util:maps,但它背后的库必须执行与 MapFactoryBean 相同的操作,因为我最终得到的键是相同的(fooBean 和barBean)
    • 这里:github.com/trevershick/so12013 年 10 月 30 日下午 4:51:50 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息:在 org.springframework.beans.factory 中预实例化单例。 support.DefaultListableBeanFactory@42d72882:定义bean [fooBean,barBean,mapOfFoos];工厂层次结构的根 foo=>com.trevershick.github.proof.so1.FooBean@6d90d6c5 bar=>com.trevershick.github.proof.so1.BarBean@400457b5
    【解决方案2】:

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

    我创建了另一个类,InnerFoo,属性为 prop1 和 prop2,我把之前的 Foo 中的属性放在那里,所以现在我的 Map&lt;String,InnerFoo&gt; 是 Foo 的唯一属性,这是我的 xml sn-p:

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多