2011-06-24 31 views
18

我已經定義了一些具有一些「常見」的值。我怎樣才能通過附加值擴展通用列表到各種新的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

閱讀了許多解決方案後,我想出了下列操作之一: http://stackoverflow.com/questions/14520536/spring-collection-merge/14521537#14521537 – BTakacs

+0

參見HTTP://計算器.com/questions/4656460/how-to-extend-already-defined-lists-and-map-in-spring-application-context – Vadzim

回答

33

您可以這樣做,但不能使用<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

根據this JIRA;對於這一點(目前,但希望在3.1將會有)沒有小的解決方案,儘管有幾種解決方法;例如this一。

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>(); 
    } 

} 
+0

雖然不太確定你爲什麼沒有使用泛型的具體實現ListsMerger類。 –

+0

DD。你是否問過如何使用'#{new xysprings.ListsMerger ().merge(@ list1,@ list2)}「'?如果在java文件中沒有任何對ListMerger 的使用,這將不起作用,否則它不會爲String編譯ListMerger實現。 –

+0

「#{new xysprings.GenericListsMerger()。merge(@ list1,@ list2)}」 –

6

基於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> 
+0

我剛剛嘗試過,它不起作用。不幸的是,只用舊的+新值覆蓋util:list。在我的情況下,我從父項目繼承了util:list,但是這個我不應該改變任何東西。 – BAER

0

您可以覆蓋或按照下面的代碼片段添加此列表中的任何其他bean。

例如:這是你的bean,需要注入下面提到的AAA util:列表。

<bean id = "BBB" class=""/> 
<util:list id="AAA"/> 
<bean id="AAAListMergeDirective" depends-on="AAA" 
parent="listMergeDirective" > 
<property name="add" ref="BBB" /> 
</bean>