可以提供一个使用Spring创建Multimap<String, String>
的示例吗?
我很好奇如何在应用程序上下文XML文件中完成此操作。
发布于 2011-01-07 13:24:12
支持Guava而不推荐使用Google Collections,所以我将回答有关Guava的问题。
我将使用这个Bean类:
public class Bean{
private Multimap<String, String> map;
public void setMap(Multimap<String, String> map){
this.map = map;
}
}
惟一可以轻松连接(仅使用XML )的Guava 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
-based方法,则必须将Supplier创建为Multimaps
类。如果您只需要一个原语实例化Supplier
,那么您可以将其创建为一个Spring 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的Supplier类,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中的相应章节:
https://stackoverflow.com/questions/4622821
复制