29. Marzo, 2008 - Martes
Aun no estas autentificado! Quieres ingresar o registrarte?

Search the Web: Advanced

Please Sign in or Register

Cetegorias:

Articulos Java

Autor: Mario Hidalgo Martinez

Fecha de Creación: 09/Noviembre/2006

Objetivo: Mostrar la manera de utilizar Dependency Injection

Descripcion: El presente Artículo pretende mostrar el principio en el que esta basado Spring framework: Dependency Injection esto através de una práctica usando Eclipse.

Contenido

1. Introduccion

El origen de Spring framework se remonta al framework llamado Interface 21 el cual fue utilizado en el libro "Expert One to One J2EE Design and Development" escrito por Rod Johnson, después se le cambio el nombre a Spring Framework, desde la primera versión lanzada en Marzo del 2004 Spring framework es Open Source y el código fuente esta bajo la licencia Apache, algunas de las razones para utilizar Spring framework son las siguientes:

  • Permite hacer un diseño por medio de interfaces de una manera sencilla.
  • Implementa patrones de diseño.
  • La documentación es extensa.
  • Es un framework open source.
  • Se comunica fácilmente con otros frameworks como lo son: Struts, Hibernate, iBatis, Tapestry, entre otros.

Dependency Injection

La arquitectura de Spring esta basada en patrón de diseño llamado "Dependency Injection", Rob Harrop define a este patrón como: "Es la manera de externalizar la creación y el manejo de las dependencias de los componentes" .
Para comprender el patrón Dependency Injection considere la figura 1 la cual es un diagrama de clases, la clase Foo depende de una instancia de la clase Bar, para realizar algún tipo de procesamiento, tradicionalmente en la clase Foo se tendría la sentencia Bar bar=new Bar(); para crear el objeto bar, usando Dependency Injection una instancia de Bar (o bien una subclase) es proporcionada a la clase Foo en tiempo de ejecución por algún proceso externo, es decir la clase Foo no llama a crear el objeto bar si no que el proceso externo le proporciona el objeto bar a la clase Foo, es por eso que Rod Johnson define a Dependency Injection con la frase: "No me llames, yo te llamo".

Figura 1. Dependencia entre clases

Pull Dependecy Injection

Esta es la manera más sencilla de obtener una instancia de una clase usando Dependecy Injection, para entender el funcionamiento se utilizará un Interface y una implementación de la interface, el diagrama de clases se muestra en la figura 2. Se utiliza una Interface llamada Service la cual tiene un método denominado doProcess, esta interface será utilizada en un método main, esta es una aproximación a lo que se le denomino anteriormente a programar en base a interfaces, la implementación será obtenida usando Dependecy Injection.


Figura 2. Diagrama de Clases Pull Dependency Injection

Practica 1. Aplicando Dependency Injection en Eclipse.

1. Deberá crear un nuevo proyecto Java nombrelo PullDependency
2. Deberá descargar los Jars de Spring framework framework
3. Deberá crear dos carpetas fuente llamadas src y resources como lo muestra la siguiente imagen.



4. Ahora agregue una carpeta llamada lib.


5. Deberá agregar los siguientes jars a la carpeta lib: spring.jar, commons-logging.jar, log4j-1.2.9.jar
6. Ahora agregue los jars al classpath del proyecto seleccionand Add Jars y agregue los tres jars antes mencionados.



7. Ahora en la carpeta src deberá agregar las siguientes clases.

Interface Service

package org.neos.model.interfaces;

public interface Service {
   public String doProcess();
}

Clase ServiceImpl

package org.neos.model.impl;

import org.neos.model.interfaces.Service;

public class ServiceImpl implements Service {
    public String doProcess() {
        return "Hola Mundo Spring";
    }
}

Clase Pull Dependency Injection. Como podemos darnos cuenta en el código fuente de la clase PullDependencyInjection se utilza la interfaz Service y no la implementación ServiceImpl, aunque en tiempo de ejecución se utiliza una referencia a ServiceImpl.

package org.neos.test;

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.neos.model.interfaces.Service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PullDependencyInjection {
	
     //logger 
	static Logger logger = Logger.getLogger(PullDependencyInjection.class);

	
   public static void main(String args[]) {
	   
	//Obtiene la informacion de los beans configurados en el archivo
       //spring.xml 	
    ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
    
  //Configura Log4j
    DOMConfigurator.configure("logging.xml");

   //Obtiene la implementacion de la interfaz Service por medio de Spring Framework 		
   //esto lo hace atraves de un id configurado en spring.xml en este caso el bean se
   //llama service
   Service service=(Service)ctx.getBean("service");
    //ejecuta un metodo de la interfaz		
   logger.debug(service.doProcess());
        
   }
}

La configuración es el punto central para que Spring realice el Dependecy Injection, esta configuración se realiza por medio de un archivo XML, observe que en la clase PullDependencyInjection se utiliza un Objeto llamado ctx el cual es el responsable de obtener la implementación de la interfaz Service por medio del método getBean().

La configuración del archivo spring.xml de este ejemplo es mostrada en la figura 3.6, observe que se tiene la <tag> bean la cual indica que se esta configurando una instancia que en el código fuente será obtenida con el id llamado "service" y la clase a la cual hace referencia es org.neos.model.impl.ServiceImpl, es por tal motivo que en la línea Service service=(Service)ctx.getBean("service"); se obtiene la implementación de la interfaz Service.

8. En la carpeta resources deberá de crear un nuevo archivo XML y nombrelo spring.xml deberá tener el siguiente contenido

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
  <!-- Configura un bean llamado service-->
   <beans>
        <bean id="service" class="org.neos.model.impl.ServiceImpl" />  
</beans>

Agregue los siguientes archivos al proyecto log4j.dtd, logging.xml estos archivos los puede descargar aqui los cuales son parte de la configuración de Log4J, si desea mayor información acerca de este tema dirijase al articulo Trabajando con LOG4j que Hugo Hidalgo ha creado para Neos Software Labs.


9. Ejecución del Programa
Ejecute la clase PullDependencyInjection y deberá observar la siguiente salida.

 2006-11-10 12:17:43 [org.neos.test.PullDependencyInjection] DEBUG - Hola Mundo Spring

Conclusiones: Hemos comprendido por medio de este articulo la manera de obtener la referencia de un objeto por medio de Spring framework usando PullDependencyInjection lo cual puede ser usado en la capa de modelo de una aplicación empresarial, la manera de usar otras formas de Dependency Injection serán vistas en artículos posteriores.

Nota de los autores: Si hay algún problema o comentario en el desarrollo del laboratorio, por favor indícanosla a través de la sección del foro de Neos Software Labs o bien a los Emails de los autores de este artículo. Este artículo también esta disponible en formato PDF