2011-01-07 7 views
3

Springを使用してMultimap<String, String>を作成する例を提供できますか?Springを使用してGoogle Guava Hashmultimapを挿入する

アプリケーションコンテキストXMLファイルでどのように処理されるのか不思議です。

+1

'Multimap'クラスはjavabeanに準拠していないので、簡単ではありません。あなたは何ができるのですか? – skaffman

答えて

7

Google Collectionsの代わりにGuavaが推奨されていますので、私はグアバについてお答えします。

私は、このBeanクラスを使用します。

public class Bean{ 
    private Multimap<String, String> map; 
    public void setMap(Multimap<String, String> map){ 
     this.map = map; 
    } 
} 

あなたは簡単に(のみXMLに)配線することができのみグアバMultimapはファクトリメソッドはMultimaps.forMap(existingMap)方法です。ここではXMLです:

<bean class="foo.bar.Bean"> 
    <property name="map"> 
     <bean class="com.google.common.collect.Multimaps" 
      factory-method="forMap"> 
      <constructor-arg> 
       <bean class="java.util.HashMap" /> 
      </constructor-arg> 
     </bean> 
    </property> 
</bean> 

あなたはMultimapsクラスで、より複雑なSupplierベースの方法のいずれかをしたい場合、あなたはJavaクラスとしてサプライヤーを作成する必要があります。

public class SupplierFactoryBean<T> extends AbstractFactoryBean<Supplier<T>>{ 

    private final Class<T> type; 
    private final Supplier<T> supplier; 

    public SupplierFactoryBean(final Class<T> type){ 
     this.type = type; 
     this.supplier = new Supplier<T>(){ 
      @Override 
      public T get(){ 
       try{ 
        return type.newInstance(); 
       } catch(final Exception e){ 
        throw new IllegalStateException(e); 
       } 
      } 
     }; 
    } 

    @Override 
    public Class<?> getObjectType(){ return type; } 

    @Override 
    protected Supplier<T> createInstance() throws Exception{ 
     return supplier; 
    } 
} 

(あなたはまた、FactoryBeanのなしサプライヤークラス上記のようにモデル化することができる、春の使用量は同じまま念:あなただけSupplierをインスタンス化プリミティブをしたい場合は、春FactoryBeanとすることを作成することができます)すべての呼び出しに対して新しいインスタンスが返されます。

これで、より複雑なメソッドを配線できます。例:

<bean class="foo.bar.Bean"> 
    <property name="map"> 
     <bean class="com.google.common.collect.Multimaps" 
      factory-method="newSetMultimap"> 
      <constructor-arg> 
       <bean class="java.util.HashMap" /> 
      </constructor-arg> 
      <constructor-arg> 
       <bean class="foo.bar.SupplierFactoryBean"> 
        <constructor-arg value="java.util.TreeSet" /> 
       </bean> 
      </constructor-arg> 
     </bean> 
    </property> 
</bean> 

使用静的ファクトリメソッド上記の両方の例。 3.3.2.2 Instantiation with a static factory method

関連する問題