Contenedores de IoC

Spring IoC Tutorial

Saber cómo la DI (inyección de dependencia) puede ser utilizado para desacoplar las dependencias entre los diferentes componentes.

StrutsPrincipal.java ———————-

package com.amalakaky;

public
class StrutsPrincipal implements Principal {

    @Override

    public
String preguntaPop() {

        return
“¿Eres nuevo en Struts?”;

    }

}

SpringPrincipal.java ———————-

package com.amalakaky;

public
class SpringPrincipal implements Principal {

    @Override

    public String preguntaPop() {

        return
“¿Eres nuevo en Spring?”;

    }

}

Tenemos una clase PrincipalService que muestra la pregunta para el usuario. La clase PrincipalService sostiene referencia a la LanzarPrograma.

PrincipalService.java ———————–

package com.amalakaky;

public
class
PrincipalService {

    Principal principal;

    

    public
void setPrincipal(Principal exPrincipal) {

        this.principal = exPrincipal;

    }

    public
void hacerPregunta()

    {

        System.out.println(principal.preguntaPop());

    }

}

Por último creamos la clase LanzarPrograma para llevar a cabo concurso.


LanzarPrograma.java —————-

package com.amalakaky;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public
class
LanzarPrograma {

    

    public
static
void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);

        PrincipalService exPrincipalService = (PrincipalService) context.getBean(“principalService”);

        exPrincipalService.hacerPregunta();

    }

}

Como se puede ver es bastante simple, aquí creamos una instancia de la clase PrincipalService y llamar a el método hacerPregunta(). Al ejecutar el programa como se esperaba “¿Eres nuevo en Spring?

“Se imprime en la consola”.

Vamos a echar un vistazo al diagrama de clases de este ejemplo. Las flechas verdes indican la generalización y las flechas de color azul indican la asociación.

Como se puede ver esta arquitectura está estrechamente ligado. Creamos una instancia de la Principal en la clase PrincipalService de la siguiente manera.

private Principal exPrincipal = new SpringPrincipal();

Para hacer nuestra prueba principal es necesario hacer modificaciones a la clase PrincipalService así.

private Principal quizMaster = new StrutsPrincipal();

Por lo tanto, está estrechamente ligado. Ahora vamos a ver cómo podemos evitar esto mediante la inyección de dependencia. El marco de trabajo Spring proporciona contenedores prowerful para gestionar los componentes. El contenedor se basa en la Inversión de Control
(IoC) y puede ser implementado mediante la inyección de dependencias (DI). Aquí el único componente tiene que elegir una forma de aceptar los recursos y el recipiente se entrega el recurso a los componentes.

En este ejemplo, en lugar de que, la creación directa de un objeto del tipo Principal en la clase PrincipalService, hacemos uso del contenedor para hacer este trabajo por nosotros. En lugar de la difícil codificación de los valores que permita que el contenedor pueda inyectar las dependencias que necesitamos.

Podemos inyectar las dependencias utilizando la inyección por constructor. Aquí vamos a ver cómo podemos hacer esto utilizando la inyección por setter.

package com.amalakaky;

public
class PrincipalService {

    Principal principal;

    

    public
void setPrincipal(Principal exPrincipal) {

        this.principal = exPrincipal;

    }

    public
void
hacerPregunta()

    {

        System.out.println(principal.preguntaPop());

    }

}

El valor de Principal se ajusta con el método setPrincipal(). El objeto Principal no se crea una instancia de la clase PrincipalService, pero aun así acceder a él. Normalmente, esto producirá una NullPointerException, pero en este caso el contenedor de Spring va a una instancia del objeto para nosotros, por lo que funciona bien.

Después de hacer todos los cambios, el diagrama de clases del ejemplo queda así.

El contenedor entra en el cuadro y ayuda en la inyección de las dependencias.

La configuración del Bean se realiza en el archivo beans.xml.

<?xml
version=“1.0”
encoding=“UTF-8”?>

<beans
xmlns=http://www.springframework.org/schema/beans&#8221;

    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance&#8221;

    xsi:schemaLocation=http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&#8221;>

    

    <bean
id=“springPrincipal”
class=“com.amalakaky.SpringPrincipal”></bean>

    <bean
id=“strutsPrincipal”
class=“com.amalakaky.StrutsPrincipal”></bean>

    <bean
id=“principalService”
class=“com.amalakaky.PrincipalService”>

        <property
name=“principal”>

            <ref
local=“springPrincipal”/>

        </property>

    </bean>    

</beans>

Se define cada bean con la etiqueta de bean tag. El atributo id de la etiqueta de bean da un nombre lógico para el bean y el atributo de la clase representa la clase del bean real. La etiqueta de propiedad se utiliza para referirse la propiedad del bean. Para inyectar un bean con la inyección de setter es necesario utilizar el <ref
local=“springPrincipal”/>

Aquí una referencia de SpringPrincipal se inyecta al bean Principal. Al ejecutar este ejemplo, “¿Eres nuevo en Spring?” Se imprime en la consola.

Para hacer que nuestra Principal hacer preguntas relacionadas con Struts, el único cambio que tenemos que hacer es, cambiar la referencia de bean en la etiqueta <ref
local=“springPrincipal”/>
por <ref
local=“strutsPrincipal”/>.

De esta manera la inyección de dependencia ayuda a reducir el acoplamiento entre los componentes

Dependencias.

Anuncios
Minientrada | Esta entrada fue publicada en Spring. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s