2

以下のような、一連のクラスに挿入する一連のルールがあります。

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

normalInvRulesとに対応するリストに共通ルールリストを含めるにはどうすればよいprepaidInvRulesですか?

ルールの数(たとえば、rule1、rule2など)が多くなり、数のグループ(normalInvRules、prepaidInvRulesなど)も多くなります。ですから、共通のルールを繰り返さずに、特定のルールだけをリストし、共通のリストへの参照を含める方法があるのではないかと思います。

4

4 に答える 4

5

これを正確に行う「コレクションのマージ」と呼ばれる機能があります。セクション3.3.3.4.1を参照してください。私がこのテーマについて書いたSpringのドキュメント または2008年のブログ投稿(例を含む)の「コレクションのマージ」。

于 2012-10-06T14:17:09.993 に答える
4

@GreyBeardedGeekによって提案されたアプローチが好きですが、さらにいくつかの提案を入れたいと思います。

a。@Configurationxmlの基本ルールリストを使用してそれを行う:

@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;
    }
}

b。リストの拡張を担当するカスタムファクトリ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>
于 2012-10-06T14:54:19.513 に答える
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>
于 2012-10-07T04:24:06.350 に答える
0

共通のルールを使用してクラスを作成し、それらを他のルールに自動配線できますか?それはうまくいきませんか?

XML configを使用して同じアプローチを取り、ref属性を使用して注入することもできます。

于 2012-10-06T14:33:49.173 に答える