【问题标题】:Is there a way to re-use a <util:list> in spring configuration file?有没有办法在 spring 配置文件中重用 <util:list> ?
【发布时间】:2012-10-06 13:58:43
【问题描述】:

我有一堆规则要注入到一组类中,如下所示:

<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 对应的列表中包含通用规则列表?

规则数量(例如 rule1、rule2 等)更多,数量组(normalInvRules、prepaidInvRules 等)也更多。所以,我想知道是否有办法避免重复通用规则,只列出特定规则并包含对通用列表的引用。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    有一个称为“集合合并”的功能可以做到这一点。 请参见第 3.3.3.4.1 节。 Spring documentation 中的“集合合并” 或2008 blog post (with an example) that I wrote on the subject

    【讨论】:

      【解决方案2】:

      我喜欢@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;
          }
      }
      

      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>
      

      【讨论】:

        【解决方案3】:

        感谢您的回复。这就是我最终使用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>
        

        【讨论】:

          【解决方案4】:

          您可以创建一个具有通用规则的类并将它们自动连接到其他规则中吗?这样不行吗?

          您可以使用 XML 配置采用相同的方法,也可以使用 ref 属性注入它。

          【讨论】:

            猜你喜欢
            • 2020-09-22
            • 2019-05-04
            • 2023-04-04
            • 1970-01-01
            • 2019-11-11
            • 1970-01-01
            • 2015-04-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多