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