Подтвердить что ты не робот

Как расширить список в spring config

Я определил a с некоторыми "общими" значениями. Как я могу расширить общий список на дополнительные значения для различных новых beans?

<util:list id="myCommonList" list-class="java.util.LinkedList">
 <bean .../>
 <bean .../>
 <bean .../>
 <bean .../>
</util:list>


<bean id="extension" parent="myCommonList">
  <bean ref="additionalValue"/>
</bean>

Будет ли это перезаписывать список или расширять его?

4b9b3361

Ответ 1

Вы можете сделать это, но не используя <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>

Ответ 2

Основываясь на ответе скаффмана, вы можете достичь этого:

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

Ответ 3

Согласно this JIRA; для этого нет тривиального решения (в настоящее время, но, надеюсь, в 3.1 будет), хотя есть несколько обходных решений; например этот.

Ответ 4

Сегодня у меня тоже была эта проблема. Для меня приемлемым решением было использование 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>();
    }

}