Inyectar Google guayaba Hashmultimap utilizando Spring

votos
3

¿Es posible dar un ejemplo de la creación de un Multimap<String, String>uso de la primavera?

Tengo curiosidad en el estudio de la forma en que se llevaría a cabo en el archivo XML contexto de aplicación.

Publicado el 07/01/2011 a las 04:41
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
7

Google Colecciones está en desuso en favor de guayaba , así que voy a responder con respecto a la guayaba.

Voy a utilizar esta clase Bean:

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

El único método de fábrica guayaba Multimapa se puede conectar fácilmente (con sólo XML) es el Multimaps.forMap(existingMap)método. Aquí está el código 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>

Si quieres uno de los más complicados Suppliermétodos basados en la Multimapsclase, se tendrá que crear los Proveedores como clases de Java. Si lo que desea es una creación de instancias primitiva Supplier, puede crear que como un resorte 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;
    }
}

(También puede modelar lo anterior como una clase de proveedor sin FactoryBean, el uso de Primavera sigue siendo el mismo. Sólo asegúrese de que devuelve una nueva instancia para cada llamada.)

Ahora se puede cablear los métodos más complicados. Ejemplo:

<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>

Ambos ejemplos anteriores utilizan métodos de fábrica estática. Aquí está el capítulo correspondiente en el manual Consulta de primavera: 3.3.2.2 instanciación con un método de fábrica estática

Respondida el 07/01/2011 a las 12:24
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more