2011-01-07 33 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