2013-06-26 38 views
2

在Java語言中,可以創建TreeMaps using our own Comparator類。現在,我想創建一個該映射並將其分配給我的一個bean。我也事先知道地圖的價值,我有興趣讓Spring注入它們。問題是,地圖類型是否可以聲明,使用構造函數參數構建(我需要它通過Comparator類)並使用Spring進行值注入?Spring使用自定義比較器創建TreeMap並填充它

這種聲明的工作,但沒有任何價值可在以後注入:

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

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

在另一方面,如果我使用Spring地圖實用程序,there are some ways來指定地圖的課,但構造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> 

OR

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

你能解釋一下,「這種聲明有效,但以後沒有價值可以注入」?你如何試圖注入? –

+0

因此,我的意思是沒有''標籤可以放入bean中。我希望兩者都用'constructor-arg'構造'TreeMap',並使用''標籤在其上注入引用的bean。 –

+0

您可以獲取bean引用並添加到您的java代碼中。否則,如果您想在xml文件中執行此操作,請僅使用util命名空間,如上例所示。 –

回答

1

這是一個很好的解決方法。我爲我的具體情況定義了一個從TreeMap延伸的子類。此類添加了比較我想通過默認的構造函數的使用方法:

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

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

} 

在那之後,我只需要指定地圖類的UTIL地圖標籤:

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

強制新班級以這種方式構建Map,我避免了Map的需要constructor-arg注入,我可以很容易地填充它。