2011-01-07 2 views
3

Можно ли привести пример создания Multimap<String, String> с использованием Spring?Inject Google Guava Hashmultimap с использованием Spring

Мне любопытно посмотреть, как это будет сделано в XML-файле контекста приложения.

+1

Нелегко, так как классы «Multimap» не соответствуют javabean. Какую вещь вы хотели бы сделать? – skaffman

ответ

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> 

Если вы хотите, чтобы одна из наиболее сложных 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

Смежные вопросы