如何在spring配置中扩展列表

时间:2011-06-24 07:02:35

标签: spring

我已经用一些“常见”值定义了一个。如何通过其他值将公共列表扩展到各种新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>

这会覆盖列表还是扩展它?

6 个答案:

答案 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)

根据this JIRA;对于这一点没有简单的解决方案(目前,但希望在3.1中会有),尽管有几种解决方法;例如this一个。

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