2

我在春天配置了一个地图,它根据键返回我的实例。但问题是它总是返回相同的映射条目实例(盘子、勺子、叉子),而不是每次都创建一个新实例,即使 bean 是原型也是如此。我错过了什么?

请注意,我正在开发一个非常旧版本的 spring。这是我的配置:

<bean id="plate" class="com.xyz.items" singleton="false"/>
<bean id="spoon" class="com.xyz.items" singleton="false"/>
<bean id="fork" class="com.xyz.items" singleton="false"/>

<bean id="ItemFactory" class="com.xyz.items.ItemFactory" >
        <property name="registeredItems">
            <map>
                <entry key="spoon" value-ref="spoon"/>
                <entry key="plate" value-ref="plate"/>
                <entry key="fork" value-ref="fork"/>
            </map>
        </property>
    </bean>

//Here's the stuff in java

public class ItemFactory {

    private Map registeredItems;


    private Item getItem(String item ){

        Item item = (Item)registeredItems.get(item);

        return item;        
    }}

|

4

1 回答 1

2

我认为,因为ItemFactorysingleton的所有生命都包含对同一个 Bean 实例的引用,无论引用的 bean 是prototype作用域的。Spring不关心原型范围的bean销毁,它只是在从单例引用时创建bean的新实例,仅此而已。

您正在prototype从具有较大范围 ( ) 的 bean 中引用具有较小范围 ( ) 的 bean singleton,这是有问题的。
请参阅从单例中引用原型 bean

这种情况有两种解决方案:

  1. 使用上面链接中描述的方法注入。
  2. getItem()方法中直接从 Spring 应用程序上下文中检索 bean。
于 2013-06-17T08:23:43.827 回答