Spring configuración XML parte II

Este tutorial es la continuación directa del curso anterior: Spring configuración XML parte I, aquí seguimos viendo las etiquetas XML que podemos utilizar para configurar el contenedor IoC de Spring.

Resolver Constructores Ambiguos

Puede darse el caso de que tengamos varios constructores con la misma cantidad de argumentos pero de distintos tipos, o que simplemente deseemos indicar los argumentos en cualquier orden, para este último caso podemos establecer el atributo index para indicar la posición del argumento, ejemplo:

<bean id="mybean" class="carmelo.spring.xml.MyBean">
    <constructor-arg value="Un Mensaje" index="1" />
    <constructor-arg value="125" index="0" />
</bean>

El constructor de la clase MyBean creada en el tutorial anterior exige primero el valor entero por lo que este es el índice inicial index = "0" y luego la cadena de texto index = "1", como podemos ver la posición de los argumentos del constructor esta definida por el atributo index.

Otro problema con el que nos podemos encontrar es que Spring definir el tipo adecuado para un argumento del constructor, en este caso debemos nosotros aportar la información del tipo, lo hacemos usando el atributo type, del siguiente modo:

<bean id="mybean" class="carmelo.spring.xml.MyBean">
    <constructor-arg value="125" type="java.lang.Integer" />
    <constructor-arg value="un texto" type="java.lang.String" />
</bean>

Como se puede observar usamos type para establecer exactamente cual es el tipo del argumento que estamos enviando al constructor.

Crear beans internos

En código Java tenemos clases internas y en Spring beans internos, estos beans son creados dentro de un bean padre y solo están accesibles para este, normalmente no indicamos su ID ya que no requerimos, además, el scope que se les aplica por defecto es prototype.

<bean id="innerbean" class="carmelo.spring.xml.OtherBean">
    <property name="myBean">
        <bean class="carmelo.spring.xml.MyBean"
              p:valor="10101" p:mensaje="InnerBean..." />
    </property>
</bean>

Previamente establecimos la propiedad myBean como una referencia a otro bean, en este caso en lugar de referenciar a otro bean lo que hicimos fue crear un bean interno para uso exclusivo de esta propiedad.

Cadenas de texto vacías y valores null

Veamos como podemos establecer una propiedad de tipo texto a una cadena vacía, solo dejamos el valor como "".

<bean id="mybean"
      class="carmelo.spring.xml.MyBean"
      p:valor="25" p:mensaje="" />

En código Java esto es equivalente a: setMensaje("").

Una cadena vacía es distinta a un valor nulo por lo que para indicar un valor nulo usaremos la etiqueta <null/>.

<bean id="mybean" class="carmelo.spring.xml.MyBean">
    <property name="mensaje" value=""></property>
    <property name="valor" ><null/></property>
</bean>

En código Java esto es equivalente a: setMensaje("") y setValor(null).

En este ejemplo mensaje es una cadena vacía y valor tiene un contenido nulo.

Configurar colecciones Java

Anteriormente vimos como configurar propiedades simples, String, Integer, Double, etc., pero que debemos hacer si deseamos configurar un bean que posee una propiedad de tipo colección como List, Set, Map, etc.

package carmelo.spring.xml;

import java.util.List;

public class ListBean {
    
    private List<String> items;

    public List<String> getItems() {
        return items;
    }

    public void setItems(List<String> items) {
        this.items = items;
    }
    
}

Cuando queramos crear un bean de esta clase y deseemos inyectar la lista de elementos, deberemos usar la etiqueta XML <list></list> dentro de ella usamos la etiqueta <value>…</value> para establecer los diferentes valores que contendrá la lista de elementos.

<bean id="listbean" class="carmelo.spring.xml.ListBean">
    <property name="items">
        <list>
            <value>primer  item</value>
            <value>segundo item</value>
            <value>tercer  item</value>
        </list>
    </property>
</bean>

En este caso la colección es de tipo java.util.List pero si fuese java.util.Set deberíamos cambiar la etiqueta <list></list> por <set></set>.

Otro posible escenario es que la colección haga referencia a una lista de beans, por ejemplo si nuestra clase ListBean tuviese la siguiente colección Set<MyBean> beanItems donde almacenaríamos un conjunto de beans de tipo MyBean, esta clase la creamos en el tutorial anterior.

<bean id="mybean_1"
      class="carmelo.spring.xml.MyBean" />

<bean id="mybean_2"
      class="carmelo.spring.xml.MyBean" />

<bean id="listbean" class="carmelo.spring.xml.ListBean">
    <property name="beanItems">
        <set>
            <ref bean="mybean_1"/>
            <ref bean="mybean_2"/>
        </set>
    </property>
</bean>

Usando la etiqueta <ref bean="…" /> hacemos referencia al bean deseado.

Otro tipo de colección que podemos configurar en Spring es java.util.Properties para usamos la etiqueta <props></props> los elementos los agregamos con <prop key="…">…</prop>, por ejemplo:

<property name="adminEmails">
    <props>
        <prop key="admin">administrator@example.org</prop>
        <prop key="support">support@example.org</prop>
        <prop key="develop">development@example.org</prop>
    </props>
</property>

Finalmente vemos las colecciones de tipo java.util.Map también conocidas como diccionarios, ya que almacenar elementos asociando una clave y un valor, con ellas usamos la etiqueta <map></map> los elementos los añadimos con <entry key="…" value="…" />.

<property name="someMap">
    <map>
        <entry key="an entry" value="just some string"/>
        <entry key="a ref" value-ref="myDataSource"/>
    </map>
</property>

En este ejemplo el segundo elemento es añadido usando value-ref esto indica que estamos haciendo referencia a otro bean.

Proyecto en GitHub: Configurar Spring con XML

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Conociendo la clase cv::Mat de OpenCV