Spring使用自定义Comparator创建一个TreeMap并填充它

时间:2013-06-26 10:35:29

标签: java spring treemap

在Java语言中,可以创建TreeMaps using our own Comparator类。现在,我想创建一个映射并将其分配给我的一个bean。我事先也知道地图值,我有兴趣让 Spring 注入它们。问题是,是否可以声明一个地图类型,使用构造函数参数构建(我需要它来传递Comparator类)并使用Spring进行值注入?

这种声明有效,但以后不能注入任何值:

<bean id="antennaFilteringManagerMap" class="java.util.TreeMap">
    <constructor-arg ref="nameComparator" />
</bean>

<bean id="nameComparator" class="com.tadic.model.detector.Antenna.NameComparator" />

另一方面,如果我使用Spring map实用程序,there are some ways来指定map的类,但是无法传递构造函数arg:

<bean class="org.springframework.beans.factory.config.MapFactoryBean">
    <property name="targetMapClass">
        <value>java.util.TreeMap</value>
    </property>
    <property name="sourceMap">
        <map>
            <entry key-ref="antenna1" value-ref="locationEventFilteringManager1" />
        </map>
    </property>
</bean>

<util:map map-class="java.util.TreeMap">
    <entry key-ref="antenna1" value-ref="locationEventFilteringManager1" />
</util:map>

1 个答案:

答案 0 :(得分:1)

这是一个很好的解决方法。我为我的特定情况定义了一个从TreeMap扩展的子类。这个类在构造函数中添加了我想默认使用的 Comparator

public static class LocationEventFilteringManagerMap extends
        TreeMap<Antenna, LocationEventFilteringManager> {

    public LocationEventFilteringManagerMap() {
        super(new Antenna.NameComparator());
    }

}

之后,我只需要在util-map标签中指定map-class:

<property name="_LocationEventFilteringManagerMap">
    <util:map
        map-class="mypackage.MyBean.LocationEventFilteringManagerMap">
        <entry key-ref="antenna1" value-ref="locationEventFilteringManager1" />
    </util:map>
</property>

强制新类以这种方式构造Map,我避免需要constructor-arg注入Map,我可以很容易地填充它。