【问题标题】:Inject Google Guava Hashmultimap using Spring使用 Spring 注入 Google Guava Hashmultimap
【发布时间】:2011-01-07 05:41:35
【问题描述】:

是否可以提供一个使用 Spring 创建Multimap<String, String> 的示例?

我很好奇如何在应用程序上下文 XML 文件中完成它。

【问题讨论】:

  • 不容易,因为Multimap 类不符合 javabean。您希望能够做什么样的事情?

标签: java spring guava


【解决方案1】:

Google CollectionsGuava 弃用,所以我会回答有关番石榴的问题。

我将使用这个 Bean 类:

public class Bean{
    private Multimap<String, String> map;
    public void setMap(Multimap<String, String> map){
        this.map = map;
    }
}

唯一可以轻松连接的 Guava 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,您可以将其创建为 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参考中的相应章节:3.3.2.2 Instantiation with a static factory method

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多