我已经用一些“常见”值定义了一个。如何通过其他值将公共列表扩展到各种新bean?
<util:list id="myCommonList" list-class="java.util.LinkedList">
<bean .../>
<bean .../>
<bean .../>
<bean .../>
</util:list>
<bean id="extension" parent="myCommonList">
<bean ref="additionalValue"/>
</bean>
这会覆盖列表还是扩展它?
答案 0 :(得分:34)
你可以这样做,但不能使用<util:list>
,这只是一种方便的语法。容器确实提供了“集合合并”功能,但您必须使用“旧”样式:
<bean id="parent" class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="sourceList">
<list>
<value>X</value>
</list>
</property>
</bean>
<bean id="child" parent="parent" class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="sourceList">
<list merge="true">
<value>Y</value>
</list>
</property>
</bean>
答案 1 :(得分:8)
根据skaffman的回答,你可以这样做:
<util:list id="parent">
<value>X</value>
</util:list>
<bean id="child" parent="parent" class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="sourceList">
<list merge="true">
<value>Y</value>
</list>
</property>
</bean>
答案 2 :(得分:2)
答案 3 :(得分:1)
今天我也遇到了这个问题。对我来说,可接受的解决方案是使用SpEL,而SpEL不支持多个语句 - 创建两个附加列表的辅助类。
可以像这样实现上下文:
<util:list id="list1">
<value>str1</value>
<value>str2</value>
</util:list>
<util:list id="list2">
<value>str3</value>
<value>str4</value>
</util:list>
<bean ...>
<property name="propertyThatRequiresMergedList"
value="#{ new x.y.springs.StringListsMerger().merge(@list1, @list2) }" />
</bean>
课程:
package x.y.springs;
import java.util.List;
public abstract class ListsMerger<T extends List> {
public T merge(T ... lists) {
T container = createContainer();
for (T list : lists) {
container.addAll(list);
}
return container;
}
public abstract T createContainer();
}
package x.y.springs;
import java.util.ArrayList;
import java.util.List;
public class StringListsMerger extends ListsMerger<List<String>> {
@Override
public List<String> createContainer() {
return new ArrayList<String>();
}
}
答案 4 :(得分:0)
您可以按照以下代码段覆盖或添加此列表中的任何其他bean。
例如:这是你需要在下面提到的AAA util:list中注入的bean。
<bean id = "BBB" class=""/>
<util:list id="AAA"/>
<bean id="AAAListMergeDirective" depends-on="AAA"
parent="listMergeDirective" >
<property name="add" ref="BBB" />
</bean>
答案 5 :(得分:0)
要将list2的元素追加到list1,请使用以下spring配置。
.Length