3
是否可以提供使用Spring創建Multimap<String, String>
的示例?使用Spring注入Google Guava Hashmultimap
我很好奇如何在應用程序上下文XML文件中完成它。
是否可以提供使用Spring創建Multimap<String, String>
的示例?使用Spring注入Google Guava Hashmultimap
我很好奇如何在應用程序上下文XML文件中完成它。
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
不容易,因爲`Multimap`類不符合javabean。你會喜歡*能夠做什麼樣的事情? – skaffman 2011-01-07 12:13:32