Java util:list在scope=";原型;?

Java util:list在scope=";原型;?,java,spring,Java,Spring,如果我使用下面的SpringXML配置,如果我将结果bean分配给多个属性,结果会是什么 <util:list id="myBeanId" scope="prototype"> <bean class="com.mypackage.MyTestBeanClass1" /> <bean class="com.mypackage.MyTestBeanClass2" /> </util:list> 在我看来,有两种可能的结果: 创建了多个

如果我使用下面的SpringXML配置,如果我将结果bean分配给多个属性,结果会是什么

<util:list id="myBeanId" scope="prototype">
  <bean class="com.mypackage.MyTestBeanClass1" />
  <bean class="com.mypackage.MyTestBeanClass2" />
</util:list>

在我看来,有两种可能的结果:

  • 创建了多个列表,但其中的bean是共享的(因为它们的作用域默认为singleton)
  • 创建多个列表,并为每个列表实例创建每个bean的新副本
还有,这个场景呢

<bean id="referencedBean" class="com.mypackage.MyTestBeanClass1" />
<util:list id="myBeanId" scope="prototype">
  <ref bean="referencedBean" />
  <bean class="com.mypackage.MyTestBeanClass2" />
</util:list>

这似乎提供了额外的可能性:

  • referencedBean
    仍然是一个单实例,但是创建了多个
    MyTestBeanClass2
    实例
  • 对于创建的列表的每个实例,
    referencedBean
    MyTestBeanClass2
    都是重复的(我觉得这不太可能,但仍然是合理的)

在春季文档中,我似乎找不到任何关于这方面的讨论。事实上,就我所见,文档中甚至没有提到util:list上的scope属性的存在。我错过了,还是这完全没有记录?如果是这样的话,我可以/应该依赖于任何特定的行为吗?

的spring文档描述了一种很好的方式来看待它:

当您创建一个bean定义时,您创建了一个菜谱,用于创建由该bean定义定义的类的实际实例。bean定义是一个菜谱的想法很重要,因为这意味着,与类一样,可以从一个菜谱创建多个对象实例

因此,无论您使用
定义bean,您仍然只是在创建一个可重用的配方。
scope
属性确定配方是否实际被重用

示例

在此示例上下文中,我定义了两个配方:

  • singleBean
    具有默认的singleton作用域
  • aList
    原型范围

两个不同的列表,有两个不同的TestBean,但只有一个SingleBean


基本上,
util:list
没有什么特别之处。如果您创建了一个具有3个属性的类,并在上面的示例中使用它而不是
util:list
,那么结果将是相同的。

好问题。我已经多次使用util:list,但不是这样。我认为应该创建多个列表,所有这些列表都将共享bean实例。这正是我直觉上所期望的工作方式,只是我无法真正找到它的确证
<bean id="singleBean" class="org.example.SingleBean" />

<util:list id="aList" scope="prototype">
    <value>some string value</value>
    <bean class="org.example.TestBean" />
    <ref bean="singleBean" />
</util:list>
List<?> list = context.getBean("aList", List.class);
List<?> list2 = context.getBean("aList", List.class);

System.out.println(list);
System.out.println(list2);
System.out.println(list == list2);
[some string value, org.example.TestBean@195198e8, org.example.SingleBean@3c0db454]
[some string value, org.example.TestBean@27ba1599, org.example.SingleBean@3c0db454]
false