如何将多个地图合并成一个春天(How to merge multiple maps into one

2019-08-02 08:09发布

我在我的背景文件中定义的几个地图。 有没有一种方法,以这些地图将包含所有参赛作品的一个地图,结合无需编写Java代码(和不使用嵌套图)? 我在寻找的地图米当量=新的HashMap(); m.putAll(carMap); m.putAll(bikeMap); 好像应该有一种方式,Spring上下文文件要做到这一点,但UTIL春3.0参考文档部分:地图并不包括这个用例。

<!-- I want to create a map with id "vehicles" that contains all entries of the other maps -->

<util:map id="cars">
    <entry key="groceryGetter" value-ref="impreza"/>
</util:map>

<util:map id="bicycles">
    <entry key="commuterBike" value-ref="schwinn"/>
</util:map>

Answer 1:

利用收集合并在春天的概念,多豆类像这样可以逐步合并。 我用这个在我的项目,以合并列出 ,但可以扩展到合并的地图为好。

<bean id="commonMap" 
      class="org.springframework.beans.factory.config.MapFactoryBean">
    <property name="sourceMap">
        <map>
            <entry key="1" value="one"/>
            <entry key="2" value="two"/>
        </map>
    </property>
</bean>
<bean id="firstMap" 
      parent="commonMap" 
      class="org.springframework.beans.factory.config.MapFactoryBean">
    <property name="sourceMap">
        <map merge="true">
            <entry key="3" value="three"/>
            <entry key="4" value="four"/>
        </map>
    </property>
</bean>

与第一个所述第二映射定义的关联是通过做parent的上属性<bean>节点和在所述第一地图中的条目与那些在第二使用合并merge属性上<map>节点。



Answer 2:

我敢打赌,有在春天这个特性没有直接的支持。

然而,写一个工厂bean在Spring使用并不难(有没有试过编译)

public class MapMerger <K,V> implements FactoryBean {
  private Map<K,V> result = new HashMap<K,V>();
  @Override
  public Object getObject() {
    return result;
  }
  @Override
  public boolean isSingleton(){
    return true;
  }
  @Override
  public Class getObjectType(){
    return Map.class;
  }
  public void setSourceMaps(List<Map<K,V>> maps) {
    for (Map<K,V> m : maps) {
      this.result.putAll(m);
    }
  }
}

在春天的配置,只是这样做:

<bean id="yourResultMap" class="foo.MapMerger">
  <property name="sourceMaps">
    <util:list>
      <ref bean="carMap" />
      <ref bean="bikeMap" />
      <ref bean="motorBikeMap" />
    </util:list>
  </property>
</bean>


文章来源: How to merge multiple maps into one in Spring