我在上下文文件中定义了几个地图。有没有办法将这些映射组合成一个包含所有条目的映射,而无需编写Java代码(并且不使用嵌套映射)?我正在寻找相当于Map m = new HashMap(); m.putAll(carMap); m.putAll(bikeMap); 看起来应该有一种方法可以在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>
答案 0 :(得分:7)
在Spring中使用collection merging概念,可以逐步合并多个这样的bean。我在我的merge lists 项目中使用了这个,但也可以扩展为合并地图。
E.g。
<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>
属性完成的,第一个映射中的条目与第二个映射中的条目使用{{ 1}} merge
节点上的属性。
答案 1 :(得分: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);
}
}
}
在spring config中,只需执行以下操作:
<bean id="yourResultMap" class="foo.MapMerger">
<property name="sourceMaps">
<util:list>
<ref bean="carMap" />
<ref bean="bikeMap" />
<ref bean="motorBikeMap" />
</util:list>
</property>
</bean>