3

在 Java 语言中,可以使用我们自己的 Comparator类来创建 TreeMap。现在,我想创建其中一个映射并将其分配给我的一个 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 实用程序,有一些方法可以指定 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>
4

1 回答 1

1

这是一个很好的解决方法。TreeMap我为我的具体情况定义了一个子类。这个类在构造函数中添加了我想默认使用的比较器:

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

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

}

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

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

强制新类以Map这种方式构造,我避免了constructor-argMap 注入的需要,我可以轻松地填充它。

于 2013-06-26T11:07:27.553 回答