3

Java 言語では、独自の Comparatorクラスを使用して TreeMap を作成できます。ここで、そのマップの 1 つを作成し、それを Bean の 1 つに割り当てたいと思います。マップの値も事前に知っているので、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 マップ ユーティリティを使用する場合、マップのクラスを指定する方法はいくつかありますが、コンストラクター 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特定のケースから拡張するサブクラスを定義しました。このクラスは、コンストラクターでデフォルトで使用するComparatorを追加します。

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

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

}

その後、マップ クラスを util-map タグに指定するだけです。

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

そのように新しいクラスを強制的に構築することで、MapMapのインジェクションが不要になり、constructor-arg簡単にデータを取り込むことができます。

于 2013-06-26T11:07:27.553 に答える