Cuando yo empecé con Spring lo miraba muy complicado y hasta cierto punto confuso, pero tirarme al agua directamente con un par de proyectos y googleando un poco he aprendido bastante. En el transcurso de mi aprendizaje en muy rara ocasión mirabla algo concreto, además empecé usando la versión 3 de Spring, la cual con la versión 2.5 varía considerablemente en muchas cosas. La ayuda que proporciona la página de Spring está bastante entendible.

En este post quiero mostrar como configurar nuestros beans con Spring. He utilizado Netbeans 6.9.1 como IDE de desarrollo y un proyecto de Maven para la gestión de dependencias.  La versión de Spring que he utilizado es las 3.0.2.RELEASE.
Para configurar spring se utiliza uno o varios archivos xml, en este caso he creado el archivo applicationContext.xml, la estructura inicial del xml debe de ser la siguiente:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Definición de Beans -- >
</beans>

Configuración de un bean

Suponiendo que se tiene el siguiente bean:

public class BasicBean {

private int id;
private String name;
private String description;

public BasicBean() {
this.id = 0;
this.name = "";
this.description = "";
}

public BasicBean(int id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("BasicBean(id={").append(this.id)
.append("}, name={\"").append(this.name)
.append("\"}, description={\"").append(this.description)
.append("\"})");
return builder.toString();
}
// setters and getters
}

Hay varias formas de configurar este bean dentro del xml anterior:

  • La forma normal, por decirlo de esa manera, es la siguiente:
    <bean name="basicBeanConf1" class="gt.edu.guatejug.springtutoriala.beans.BasicBean">
    <property name="id"><value>1</value></property>
    <property name="name"><value>Bean Name 1</value></property>
    <property name="description"><value>Description form bean with id 1</value></property>
    </bean>

    En donde name, es el nombre que identifica al bean y debe de ser único, en el atributo class, se le indica el tipo de dato del bean.

    Dentro del tag <property>, van todas las propiedades del bean que tienen setters y getters implementados, con el atributo type se le puede indicar el tipo de dato de la propiedad, si no se le ingresa, Spring automaticamente determina el tipo de dato y dentro de este tag, el tag <value> que indica el valor de la propiedad.

  • La forma corta de configurar un bean es la siguiente:
    <bean name="basicBeanConf2" class="gt.edu.guatejug.springtutoriala.beans.BasicBean">
    <property name="id" value="2" />
    <property name="name" value="Bean Name 2" />
    <property name="description" value="Description for bean with id 2" />
    </bean>

    Ya no se utiliza el tag value, para poner el valor se utiliza como atributo del tag property.

  • Otra forma de configurar un bean es haciendo uso del equema p, esta forma de configurar beans aparece desde la versión 2.0.

    Primero que nada se debe de declarar el esquema en el nodo raiz del xml de la siguiente forma:

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!-- Definición de Beans -- >
    </beans>

    Teniendo hecho lo anterior, para configurar un bean podemos hacer lo siguiente:

    <bean name="basicBeanConf3" class="gt.edu.guatejug.springtutoriala.beans.BasicBean"
    p:id="3" p:name="Bean Name 3" p:description="Description for bean with id 3"/>

    Todas las declaraciones se hacen desde que se declara el bean sin necesidad de utilizar otros tag.

    Los atributos del bean se mandan a llamar despues de p: y son los mismos como se declaran en el bean.

  • Tambien se puede llamar a un constructor cuando se crea un bean, se hace de la siguiente forma:
    <bean name="basicBeanConf4" class="gt.edu.guatejug.springtutoriala.beans.BasicBean">
    <constructor-arg>
    <value>4</value>
    </constructor-arg>
    <constructor-arg>
    <value>Bean Name 4</value>
    </constructor-arg>
    <constructor-arg>
    <value>Description for bean with id 4</value>
    </constructor-arg>
    </bean>
    Spring automaticamente, detectar el constructor adecuado conforme la configuración que se hizo. En otro post explicaré mas a detalles la llamada a los constructures de un bean.

Corriendo el demo

Basta de configuraciones, ahora para probar lo que se explicó anteriormente he utilizado una clase con el metodo main, con el siguiente código:

public static void main( String[] args ){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

BasicBean basicBean = (BasicBean) context.getBean("basicBeanConf1");
System.out.println(basicBean.toString());

basicBean = (BasicBean) context.getBean("basicBeanConf2");
System.out.println(basicBean.toString());

basicBean = (BasicBean) context.getBean("basicBeanConf3");
System.out.println(basicBean.toString());

basicBean = (BasicBean) context.getBean("basicBeanConf4");
System.out.println(basicBean.toString());

}

En la línea 2, se inicializa indicando el archivo xml que contiene los beans. Esto varía dependiendo el contexto en el que se está utilizando Spring.

Al ejecutar el código aparece en consola lo siguiente:

BasicBean(id={1}, name={"Bean Name 1"}, description={"Description for bean with id 1"})
BasicBean(id={2}, name={"Bean Name 2"}, description={"Description for bean with id 2"})
BasicBean(id={3}, name={"Bean Name 3"}, description={"Description for bean with id 3"})
BasicBean(id={4}, name={"Bean Name 4"}, description={"Description for bean with id 4"})

Esto es solo un pequeño ejemplo de como configurar beans con Spring 3. Para descargar el código fuente de este ejemplo, pulse AQUÍ.

Esta interfaz se utiliza en muchas ocasiones cuando se programa en Java, independientemente que se esté desarrollando en mas de alguna ocasión se es utilizada.
Ésta interfaz tiene muchas características y también las clases que la implementan, ya se tienen clases que algún comportamieno en particular y también se puede implementar una lista haciendo uso de la interfaz y/o heredando el comportamiento de otras clases y hacer cambios conforme a ciertos requerimientos.

A diferencia de java.util.Set, java.util.List permite el ingreso de elementos duplicados evaluados con lo funcion equals().

En definicion, una lista es una colección ordenada de elementos, también conocida como “secuencia”, las clases que implementan ésta interfaz tiene el control de la posición en donde están insertado los elementos.
Las clases que implementan esta interfaz son las siguientes:
  • AbstractList

    Esta clase abstracta provee la estructura de una lista, se utiliza para realizar una lista de acceso aleatorio (como un arreglo).

    Se deben de implementar, obligatoriamente, los métodos get (int) y size (). Pero, para implementar una lista modificable se deben de implementar, adicionalmente, los métodos set(int, E). Y si la lista es de tipo variable se deben de implementar los métodos add(int, E) y remove(int).

    No se debe de proveer una implementación para iterar, ya que en está clase ya está implementado.

  • AbstractSequencialList

    Esta clase abstracta que hereda de la clase AbstractList, varia en que el acceso ya no es aleatorio si no que es un acceso secuencial (como un LinkedList).

    Además, obligatoriamente, se debe implementar el iterador de la lista, especificamente los métodos ListIterator(E) y size(). Para una lista no modificable, se debe de implementar los métodos hastNext, next, hasPrevious, previous e index.

    Para una lista modificable, se debe implementar el método set(int, E). Y para una lista de tamaño variable, se debe de implementar los métodos remove y add.

  • ArrayList

    Hereda de la clase AbstractList, es una implementación de una lista de tamaño variable. Permite todo tipo de elementos e incluso valores nulos, es casi equivalente a la clase Vector pero con la diferencia que ArrayList no es sincronizada (lo cual se debe de tener cuidado a la hora de trabajar concurrentemente).

    Tiene una capacidad de almacenamiento, con cada elemento ingresado la capacidad crece automaticamente.

  • AttributeList

    Hereda de la clase ArrayList, se encuentra dentro del paquete javax.management, se diferencia de la clase padre en que solo permite elementos de tipo javax.management.Attribute que es una implementación de un bean de manera general.

  • CopyOnWriteArrayList

    Esta clase es muy eficiente cuando se trabaja concurrentemente. Los métodos para cambiar la lista no están suportados (remove, set y add) por lo cual se genera una excepción.

    Permite todo tipo de elementos incluidos valores nulos.

  • LinkedList

    Hereda de la clase AbstractSequencialList. Permite todo tipo de elementos incluidos valores nulos, provee los métodos para obtener (get), remover (remove) e insertar (insert) elementos al inicio y al final de la lista.

    Estas operaciones permiten vincular listas que pueden ser utilizada como pilas, colas y doble listas.

  • RoleList

    Hereda de la clase ArrayList, es parecida a la clase AttributeList, con la diferencia que permite solo elementos de tipo javax.management.relation.Role, que encapsulan un nombre y un listado de relaciones.

  • RoleUnresolvedList

    Parecida a la anterior, pero permite solo elementos de tipo javax.management.relation.RoleUnresolved, que tiene una funcionalidad parecida a la clase Role.

  • Stack

    Es una lista que representa el comportamiento de una pila (LIFO) y hereda de la clase Vector pero tiene otros métodos que permiten su comportamiento.

  • Vector

    Ésta clase se parece mucho a ArrayList con la diferencia que está sincronizada. Esta clase actualmente se encuentra obsoleta y para manejar la sincronización se recomienda usar ArrayList haciendo uso de Collection.synchronizedList.


Ésto es un pequeño resumen y definición de la interface java.util.List, si me he confundido en algo, se agradecerá hacerlo saber.

Referencias