簡體   English   中英

使用Spring注入Google Guava Hashmultimap

[英]Inject Google Guava Hashmultimap using Spring

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

我很想知道如何在應用程序上下文XML文件中完成它。

谷歌收藏品不贊成使用番石榴 ,因此我將回答有關番石榴的問題。

我將使用這個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的方法,則必須將供應商創建為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 Reference中的相應章節: 3.3.2.2使用靜態工廠方法實例化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM