2

コンテキスト ファイルにいくつかのマップが定義されています。Java コードを記述せずに (ネストされたマップを使用せずに)、これらのマップをすべてのエントリを含む 1 つのマップに結合する方法はありますか? Map m = new HashMap(); に相当するものを探しています。m.putAll(carMap); m.putAll(バイクマップ); Spring コンテキスト ファイルでこれを行う方法があるはずですが、util:map の Spring 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>
4

2 に答える 2

7

Spring のコレクション マージの概念を使用すると、このような複数の Bean を段階的にマージできます。プロジェクトでこれを使用してリストをマージしましたが、マップをマージするように拡張することもできます。

例えば

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

parent2 番目のマップ定義と最初のマップ定義の関連付けは、ノードの属性を介して行われ、最初のマップのエントリは、ノードの属性<bean>を使用して 2 番目のマップのエントリとマージされます。merge<map>

于 2012-11-06T02:13:31.090 に答える
1

Spring では、この機能を直接サポートしていないに違いありません。

ただし、Spring で使用するファクトリ Bean を作成することはそれほど難しくありません (コンパイルは試みていません)。

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>
于 2012-11-06T03:13:28.163 に答える