上面的 ListMergerFactoryBean 解决方案存在一个微妙的错误。
配置:
<util:list id="listA" value-type="java.lang.String">
<value>fooA</value>
<value>barA</value>
</util:list>
<util:list id="listB" value-type="java.lang.String">
<value>fooB</value>
<value>barB</value>
</util:list>
<util:list id="listC" value-type="java.lang.String">
<value>fooC</value>
<value>barC</value>
</util:list>
<bean id="AwithB" class="com.util.ListMergerFactoryBean">
<property name="listOfLists">
<list>
<ref bean="listA" />
<ref bean="listB" />
</list>
</property>
</bean>
<bean id="AwithC" class="com.util.ListMergerFactoryBean">
<property name="listOfLists">
<list>
<ref bean="listA" />
<ref bean="listC" />
</list>
</property>
</bean>
使用此配置,当 bean AwithB 具有 AwithC 的预期内容时,您可能会感到惊讶。ListA 是一个单例,getObject 方法会更改它,因此会为 ListMergerFactoryBean 的所有用户更改它,即使 bean 工厂不是单例。解决方法是不重复使用 listOfLists 中的第一个列表:
@Override
public List getObject() throws Exception {
List mergedList = new ArrayList();
for (List list : listOfLists) {
mergedList.addAll(list);
}
return mergedList;
}