Foros del Web » Programación para mayores de 30 ;) » Java »

Duda concepto: inyección de dependencia y acoplamiento en Spring

Estas en el tema de Duda concepto: inyección de dependencia y acoplamiento en Spring en el foro de Java en Foros del Web. Hola! Supuestamente al ejecutar la siguiente línea en Spring: HelloWorld obj = (HelloWorld) context.getBean("helloBean"); estoy reduciendo el acoplamiento, ya que no estoy instanciando la clase ...
  #1 (permalink)  
Antiguo 11/10/2014, 14:24
 
Fecha de Ingreso: octubre-2014
Mensajes: 2
Antigüedad: 10 años, 1 mes
Puntos: 0
Duda concepto: inyección de dependencia y acoplamiento en Spring

Hola!

Supuestamente al ejecutar la siguiente línea en Spring:
HelloWorld obj = (HelloWorld) context.getBean("helloBean");

estoy reduciendo el acoplamiento, ya que no estoy instanciando la clase HelloWorld. Sin embargo, dado que tengo que hacer un casteo para poder almacenar el objeto, debo seguir utilizando el nombre de la clase y por tanto generando cierto acoplamiento.

Mi duda es ¿Por qué la línea de código anterior reduce el acoplamiento?

Muchas gracias!
  #2 (permalink)  
Antiguo 11/10/2014, 14:32
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Duda concepto: inyección de dependencia y acoplamiento en Spring

Hola:

Por un lado, HelloWorld debería ser una interfaz. En Spring alguien instancia "helloBean" con una clase que implemente la interfaz y tú, con esa línea de código, obtienes la instancia pero sólo dependes de la interfaz, no sabes en absoluto cual es la clase que realmente hay detrás.

Por otro lado, la inyección de dependencias consiste en que no seas tú el que tengas que pedir el bean. En tú código, debes poner un método setHelloWorld(HelloWorld) y debería ser Spring el que te llama a ese método. Para conseguirlo, puedes usar anotaciones ( http://blogs.sourceallies.com/2011/0...and-autowired/ ) o bien haciendo que tu clase también sea un bean que instancie spring en el fichero xml correpondiente y haciendo en ese xml la llamada al set.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 12/10/2014, 01:38
 
Fecha de Ingreso: octubre-2014
Mensajes: 2
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Duda concepto: inyección de dependencia y acoplamiento en Spring

Hola chuidiang, muchísimas gracias por responderme.

He hecho lo que me has dicho, me ha quedado esto:

Main.java
HelloWorldHelper helloWorldHelper = new HelloWorldImpl();
HelloWorldHelper.hello();


HelloWorldHelper
public class HelloWorldHelper{

HelloWorldInterface helloWorldInterface;

public HelloWorldHelper(){
helloWorldInterface = new HelloWorldImpl();
}

public void setHelloWorldInterface(HelloWorldInterface helloWorldInterface){
this.helloWorldInterface = helloWorldInterface;
}

}

beans.xml
<bean id="helloWorld" class="com.pp.HelloWorld">
<property name="helloWorldInterface" ref="HelloWorldImpl" />
</bean>
<bean id="HelloWorldImpl" class="com.pp.HelloWorldImpl" />



Pero no entiendo que ventaja tiene usar un helper, frente a no usarlo. Si no lo usase me quedaría el código así:

Main.java
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
HelloWorldInterface helloWorld = (HelloWorldInterface) context.getBean("helloWorld");
helloWorld.hello();

beans.xml
<bean id="helloWorld" class="com.pp.springBeans.HelloWorldImpl">
</bean>


En ambos casos utilizo una esta clase y una interfaz:
HelloWorldImpl
public class HelloWorldImpl implements HelloWorldInterface{
public void hello() {
System.out.println("Hello world! ");
}
}

HelloWorldInterface.java
public interface HelloWorldInterface {
public void hello();
}



Muchiiiiiiiiiiiiiiiiiisimas gracias!! estos conceptos se me hacen un poco duros.
  #4 (permalink)  
Antiguo 12/10/2014, 04:10
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Duda concepto: inyección de dependencia y acoplamiento en Spring

Hola:

La idea de inyección de dependencias es esta. Una clase que necesita HelloWorld (una interface)

Código Java:
Ver original
  1. public class UsaHelloWorld {
  2.     private HelloWorld a;
  3.     public void setHelloWorld(HelloWorld a) {
  4.          this.a=a;
  5.     }
  6.     public void usaHelloWorld() {
  7.         a.sayHello();
  8.     }
  9. }

Y ahora, desde fuera, haces

Código Java:
Ver original
  1. public static void main (String [] args) {
  2.    UsaHelloWorld a = new UsaHelloWorld();
  3.    a.setHelloWorld (new HelloWorldImpl());
  4.    a.usaHelloWorld();
  5. }

Lo que consigues de esta forma es que la clase UsaHelloWorld no dependa para nada de la implementación, sólo depende de la interfaz. Podrías hacer otra clase totalmente distinta que implemente HelloWorld, pasársela a UsaHelloWorld y esta última ni siquiera tienes que recompilarla.

Quizás este enlace te ayude un poco a entender mejor el concepto http://blog.chuidiang.com/2009/04/28...-de-servicios/

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: clase, concepto, inyección, spring
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:43.