2012-10-06 46 views
2

我已規則一堆被注入了一組類,類似如下:有沒有辦法在spring配置文件中重新使用<util:list>?

<bean id="rule1" class="com.vikdor.rules.Rule1" /> 
<bean id="rule2" class="com.vikdor.rules.Rule2" /> 
<bean id="rule3" class="com.vikdor.rules.Rule3" /> 
<bean id="rule4" class="com.vikdor.rules.Rule4" /> 
<bean id="rule5" class="com.vikdor.rules.Rule5" /> 

<util:list id="commonRules"> 
    <ref bean="rule1" /> 
    <ref bean="rule3" /> 
    <ref bean="rule5" /> 
</util:list> 

<util:list id="normalInvRules"> 
    <!-- Include common rules --> 
    <ref bean="rule4" /> 
</util:list> 

<util:list id="prepaidInvRules"> 
    <!-- Include common rules --> 
    <ref bean="rule2" /> 
</util:list> 

我怎麼能包括對應normalInvRulesprepaidInvRules列表中的共同規則列表?

規則的數量(例如規則1,規則2等)更多,數量組(normalInvRules,prepaidInvRules等)也更多。所以,我想知道是否有辦法避免重複常規規則,只列出特定的規則,幷包含對常用列表的引用。

回答

0

您可以創建一個具有常用規則的類並將它們自動連接到其他規則中?這不行嗎?

您可以採用使用XML配置的相同方法,並使用ref屬性注入它。

4

我喜歡@GreyBeardedGeek建議的辦法,只是想多了一些建議拋出:

一個。使用@Configuration與XML基本規則列表做:

@Configuration 
@ImportResource("classpath:/baseconfig.xml") 
public static class RulesConfiguration{ 
    @Resource List<Rule> commonRules; 

    @Bean 
    public List<Rule> normalInvRules(){ 
     List<Rule> rules = new ArrayList<Rule>(); 
     rules.addAll(commonRules); 
     rules.add(new Rule()); 
     return rules; 
    } 
} 

灣使用自定義工廠bean,負責擴展列表:

class ListExpandingFactoryBean<T> implements FactoryBean<List<T>>{ 

    private List<T> baseList; 
    private List<T> extendedList; 

    @Override 
    public List<T> getObject() throws Exception { 
     List<T> consolidatedList = new ArrayList<T>(); 
     consolidatedList.addAll(baseList); 
     consolidatedList.addAll(extendedList); 
     return consolidatedList; 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return List.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return false; 
    } 
    public void setBaseList(List<T> baseList) { 
     this.baseList = baseList; 
    } 

    public List<T> getExtendedList() { 
     return extendedList; 
    } 

    public void setExtendedList(List<T> extendedList) { 
     this.extendedList = extendedList; 
    } 

} 

,並用它這種方式:

<bean name="normalInvRules" class="ListExpandingFactoryBean" p:baseList-ref="commonRules"> 
    <property name="extendedList"> 
     <list> 
      <ref bean="bean4"/> 
     </list> 
    </property> 
</bean> 
1

感謝您的答覆。這就是我最終如何使用Collection Merging

<bean id="rule1" class="com.krovi.rules.Rule1" /> 
<bean id="rule2" class="com.krovi.rules.Rule2" /> 
<bean id="rule3" class="com.krovi.rules.Rule3" /> 
<bean id="rule4" class="com.krovi.rules.Rule4" /> 
<bean id="rule5" class="com.krovi.rules.Rule5" /> 

<bean id="commonList" 
    class="org.springframework.beans.factory.config.ListFactoryBean"> 
    <property name="sourceList"> 
     <list> 
      <ref bean="rule1" /> 
      <ref bean="rule2" /> 
      <ref bean="rule3" /> 
     </list> 
    </property> 
</bean> 
<bean id="firstExecutorRules" parent="commonList" 
    class="org.springframework.beans.factory.config.ListFactoryBean"> 
    <property name="sourceList"> 
     <list merge="true"> 
      <ref bean="rule4" /> 
     </list> 
    </property> 
</bean> 
<bean id="secondExecutorRules" parent="commonList" 
    class="org.springframework.beans.factory.config.ListFactoryBean"> 
    <property name="sourceList"> 
     <list merge="true"> 
      <ref bean="rule5" /> 
     </list> 
    </property> 
</bean> 
相關問題