Можно ли привести пример создания Multimap<String, String>
с использованием Spring?Inject Google Guava Hashmultimap с использованием Spring
Мне любопытно посмотреть, как это будет сделано в XML-файле контекста приложения.
Можно ли привести пример создания Multimap<String, String>
с использованием Spring?Inject Google Guava Hashmultimap с использованием Spring
Мне любопытно посмотреть, как это будет сделано в 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>
Если вы хотите, чтобы одна из наиболее сложных Supplier
-На методов в Multimaps
классе, вам придется создать поставщиков как Java классов. Если вы просто хотите примитивный инстанцировании 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, использование 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: 3.3.2.2 Instantiation with a static factory method
Нелегко, так как классы «Multimap» не соответствуют javabean. Какую вещь вы хотели бы сделать? – skaffman