Как расширить список в 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>
Будет ли это перезаписывать список или расширять его?
Ответы
Ответ 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>();
}
}