<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ include file="/WEB-INF/jsp/include.jsp" %> Introducción a Spring

Framework Spring

Ramiro Lago Bagüés (Enero 2008)


¿Qué es Spring?

Algunas características que hacen interesante el framework Spring:


Core Container

Una aclaración previa: un bean, en el contexto de Spring, es un objeto que es creado y manejado por el contenedor Spring. Es importante destacar la diferencia con respecto al uso clásico de 'bean' en J2EE: en Spring el bean no es una clase que cumple una serie de normas o restricciones, sino que es un objeto.

Los paquetes org.springframework.beans y org.springframework.context proporcionan la base para el contenedor IoC (Spring Framework's IoC container). En el primer paquete tenemos el interfaz BeanFactory, que proporciona la capacidad de gestionar cualquier tipo de objeto. En el segundo paquete tenemos el subinterfaz ApplicationContext, construido sobre la base del anterior. Añade a BeanFactory una mejor integración con AOP, manejo de internacionalización, propagación de eventos, manejo de contextos web con WebApplicationContext, etc.

La implementación más utilizada de BeanFactory es la clase XmlBeanFactory. Esta implementación toma de un archivo XML la definición de instancias o beans, así como sus dependencias. Por ejemplo:



    <bean id="springappController" class="spring03.SpringappController">
        <property name="libreria">
            <ref bean="libs"/>
        </property>
    </bean>

    <bean id="libs" class="spring03.negocio.Libreria">
        <property name="libros">
            <list>
                <ref bean="libro1"/>
                <ref bean="libro2"/>
                <ref bean="libro3"/>
                <ref bean="libro4"/>
            </list>
        </property>
    </bean>
	...

En este ejemplo el bean springappController (de la clase spring03.SpringappController) tiene un atributo (librería) que es una referencia al bean libs, de la clase spring03.negocio.Libreria. La libreria tiene la propiedad libros, que es una lista de libros (los bean para los libros no aparecen en este resumen del ejemplo).

Un ejemplo de instancia del contenedor podría ser el siguiente, donde al constructor se le pasa como argumento el archivo XML donde se definen los beans y sus dependencias:


	XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("org/xml/application-context.xml"));

Si no se quiere tener toda la definición de beans en un único archivo XML se puede utilizar la etiqueta import. Ejemplo:


<beans>
	<import resource="services.xml"/>
	<import resource="resources/messageSource.xml"/>
	<import resource="/resources/themeSource.xml"/>

	<bean id="bean1" class="..."/>
	<bean id="bean2" class="..."/>
</beans>

El directorio de referencia de las importaciones es aquel en el que se encuentra el archivo base. Los archivos importados deben tener la etiqueta 'beans' y hacer referencia al DTD o esquema.


Inversión de Control (IoC)

Dentro del modo de programación imperativa estamos acostumbrados a pensar en un flujo de control predefinido por el programador. Sin embargo hay contextos (el caso típico son los modernos interfaces gráficos de usuario) en los que la aplicación cede el control a un API o sistema externo. Es dicho sistema el que determina los eventos que incidirán en el ciclo de vida de nuestra aplicación. Un ejemplo de inversión de control se encuentra en el modelo de programación orientado a eventos de Swing o AWT. De manera informal, la IoC viene representada por la frase "No me llames, yo te llamaré". Es el sistema externo el que llama a nuestra aplicación.

Veamos diferentes tipos de IoC:

Un ejemplo de "Dependency lookup" puede ser el que sucede en RMI


	String url = "rmi://localhost/";
	String nombreObjetoRemoto = "ob1"
	...
	ClaseRemota ob = (ClaseRemota) Naming.lookup( url + nombreObjetoRemoto);
	System.out.println( ob.getString() );	

El objeto cliente para acceder al servicio primero lo identifica y después lo localiza por medio de una referencia (en el ejemplo la referencia es "ob"); a continuación hace la llamada al procedimiento. El inconveniente es el acoplamiento entre la capa cliente (front), la capa de acceso al servicio y la implementación del servicio.

Spring se identifica con una forma de IoC denominada Inyección de Dependencia, en la que el servicio se identifica y localiza por medio de mecanismos no programáticos, externos al código, como por ejemplo un archivo XML. Las dependencias con respecto a los servicios son explicitas y no están en el código. Con ello se gana en facilidad de test y mantenimiento. Algunas formas de inyección de dependencia son:


Descarga de Spring

La descarga del framework se puede hacer en la web de Spring.

Para utilizar Spring en nuestro proyecto simplemente tenemos que instalar la librería spring.jar, que exige además la librería de log básico: commons-logging-api.jar, normalmente incluida en la distribución de Tomcat. Si utilizamos Eclipse tenemos que hacer Project - Properties - Java Build Path - Add Jars. Además se puede señalar el "JavaDoc Location" (donde se encuentran los JavaDoc de spring.jar), estos JavaDocs se incluyen también en el archivo descargado. Ejemplo de "JavaDoc Location": file:/C:/DOC/Spring/spring-framework-2.0.7/docs/api/.



Volver