2011-01-07 58 views
3

是否可以提供使用Spring創建Multimap<String, String>的示例?使用Spring注入Google Guava Hashmultimap

我很好奇如何在應用程序上下文XML文件中完成它。

+1

不容易,因爲`Multimap`類不符合javabean。你會喜歡*能夠做什麼樣的事情? – skaffman 2011-01-07 12:13:32

回答

7

Google Collections已棄用Guava,所以我會回答有關番石榴。

我將使用這個Bean類:

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

唯一的番石榴Multimap之工廠方法可以很容易的(只有XML)是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類。如果你只是想一個基本實例Supplier,您可以創建一個春天FactoryBean

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,Spring的用法是一樣的只要確保。它會爲每個呼叫返回一個新實例。)

現在,您可以連線更復雜的方法。例如:

<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> 

以上使用靜態工廠方法這兩個例子。這裏是Spring Reference中的相應章節:3.3.2.2 Instantiation with a static factory method