Duda Inyeccion de Dependencias y Xml. quien depende de quien?

Iniciado por cyberserver, 7 Febrero 2011, 05:54 AM

0 Miembros y 1 Visitante están viendo este tema.

cyberserver

Hola buenas noches.!!!

Quisiera ver si me pueden ayudar a resolver una duda.!


Ejemplo del Problema :
Tengo 3 clases A,B,C,D

A utiliza un metodo de B, y B utiliza una metodo de D al igual que C
Citar
A->B
B->D
C->D

Ahora bien recurri a la inyeccion de dependencias para disminuir el acomplamiento entre las Clases (Tambien use interfaces pero por ahora no lo ejemplifique para facilitar el asunto) y para evitar la Redundancia al momento de instancia clases. esto lo hago con Spring Framework y Context Xml.

mi codigo en la clase A para crear la instancia es:
Código (java) [Seleccionar]

FileSystemXmlApplicationContext FSXObj = new FileSystemXmlApplicationContext("Archivo.xml");
A ObjA = (A)FSXObj.getBean("ClaseB");


mi Archivo.xml es el siguente:
Código (xml) [Seleccionar]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
   "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
<bean id="ClaseB" class="B"></bean>
</beans>


de igual manera esto se hace en la Clase B y C.

Esto como ven no tiene nada del otro mundo, pero mi pregunta es.

Pero si estoy dependiento de FileSystemXmlApplicationContext de Spring entonces donde queda la inyeccion?.

He pensado en crear una Clase X donde primero cargue todas las Dependencias del Xml y despues las valla inyectando a las demas Clases ya sea por el Constructo o por Setter.
pero que sentido tendria esto..... ya que todas mis Clases serian dependientes de la clase X? mejor utilizo el Container y me dejo de tonterias.

Y despues tendria que configurar las Clases para resivir la inyeccion de la dependencia... Yo me pregunto

Carajo... no estas pensando mas en tratar de facilitar las cosas que en lo que hace tu proyecto...!!! no por mejorar y preveer el futuro para el mantenieminto de las Clases estas haciendo mas codigo y a la larga va a ser mas dificil darle mantenimiento?



Alguien de Ustedes tendra un ejemplo sencillo o diagrama de clases Uml de Inyeccion de Dependencias con xml? ? ?

Muchas Gracias por su atencion.

Nota: Si vas a comentar solo para criticar el nombre de mis clases o cosas "Estupidas" mejor reservate tus comentarios. Gracias!
Estupida no es Groceria he
Citar
estúpido, -da
adj.-s. Notablemente torpe para comprender las cosas.
adj. Díc. del dicho o hecho propios de un estúpido.






cyberserver

Miren. aqui les traigo Otro ejemplo mucho mas elaborado acerca del problema que veo con Spring y Xml (Yo se que el problema esta en mi es por eso que recurro al foro)



Aqui todas mi Clases Dependen de Spring.

Y si supongamos que utilizo la inyeccion de dependencias enviado las dependencias al constructor de las Clases, ¿ al iniciar mi aplicacion  tengo que inyectar Toditititas las Clases que contenga mi proyecto?

O si no es asi como puedo organizar mi proyecto para que se vallan inyectando las dependencias como las vaya necesitando.. ?






sapito169

#2
No busques las cosas pregunta por ellas eso quiere decir que no trates de instanciar nada dentro de tu clase caso más concreto no trates olvídate de la palabra reservada new la inejection de dependencias es para matar news

Es decir que  en vez de

clas unClaseConDependencias{
FileSystemXmlApplicationContext FSXObj = new FileSystemXmlApplicationContext("Archivo.xml");
A ObjA = (A)FSXObj.getBean("ClaseB");
..........
}


pongas

clas unClaseConDependencias{
private A ObjA
        unClaseConDependencias(A ObjA){
            this.a=a;
        }
..........
}


Y luego para crear toda la aplicación le pides a spring que te cree una instancia de toda la aplicación (con todos sus objetos ya bien instanciados) en el metodo main



ApliacionVentasMeracaditoDeMiPueblo appventas = contenedorCreaUna("ApliacionVentasMeracaditoDeMiPueblo");
appventas.arrancar();



Recuerda que spring o el contenedor de dependencias es el encargado de crear toda la aplicación es su responsabilidad para eso lo diseñaron y para eso trabaja bien las responsabilidades de tus clases solo son las que les incumben su responsabilidad no es crearse eso es problema de otros claro ay una excepción cuando cuando usas el patrón factory pero mejor nunca usas factories y dejas a spring que sea tu factory

Otra cosa es que spring pide que uses ficheros de configuración grandes de xml(los odio) y pierdes todas las ventajas que te da el compilador de java es decir que es posible que instancies mal las clases por eso te recomiendo que te bajes los plugins y erramientas que trabajen son spring además de asegurar de que el ide sea capaz de ayudarte en la creación de el fichero xml


http://misko.hevery.com/2008/09/10/where-have-all-the-new-operators-gone/
http://misko.hevery.com/2008/08/29/my-main-method-is-better-than-yours/

un link con juesto lo que pides y que trabaja con spring

http://www.springbyexample.org/examples/intro-to-ioc-creating-a-spring-application.html


cyberserver

#3
De verdad muchas Gracias por tu explicacion, me sirvio mucho.! :)

Pero tengo una pregunta mas :

Citarluego para crear toda la aplicación le pides a spring que te cree una instancia de toda la aplicación (con todos sus objetos ya bien instanciados) en el metodo main

Esto quiere decir que en el metodo main tengo que pedirle a spring que cargue el Context (Xml)  para  posteriormente poder inyectar las dependencias a las demas Clases con Setter
Por ejemplo:

Clase A:
Código (java) [Seleccionar]

class A{
    Private B ObjB;
        SetDependenciaB(B ObjB){
            this.B=ObjB;
        }
       
        OtroMedoto(){
               B.Correr();
        }

}


Main:
Código (java) [Seleccionar]


FileSystemXmlApplicationContext FSXObj = new FileSystemXmlApplicationContext("Archivo.xml");

A ObjA = (A)FSXObj.getBean("ClaseA");
B ObjB = (B)FSXObj.getBean("ClaseB");


A.setDependenciaB(ObjB);



siendo mi xml el siguiente:

Código (xml) [Seleccionar]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
   "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
<bean id="ClaseA" class="A"></bean>
       <bean id="ClaseB" class="B"></bean>
</beans>




Esto creo que esta bien. pero si yo tuviera una aplicacion con Muchisisisismas Clases entonces en la Clase de Arranque o en su defecto el Main tendria que inyectar todas las dependencias de una vez ??



Muchas Gracias por su atencion.






sapito169

Citar
Esto quiere decir que en el metodo main tengo que pedirle a spring que cargue el Context (Xml)  para  posteriormente poder inyectar las dependencias a las demas Clases con Setter

si vas a crear toda la aplicacion en el metodo main una sola ves con todas las dependencias

yo recomiendo que no la injeccion por setters es fea y desaconsejada mejor injecta todo por el constructor y nunca buelves a usar injecction por setters a menos que no tengas opcion como por ejemplo en codigo legado

Citar
Esto creo que esta bien. pero si yo tuviera una aplicacion con Muchisisisismas Clases entonces en la Clase de Arranque o en su defecto el Main tendria que inyectar todas las dependencias de una vez ??

ahora ya sabes por que mucha gente detesta spring y todo lo que sea "empresarial" es demasiado complejo dificil abusa del xml y la configuracion es casi imposible pero es que no existe otra opcion lo que es complejo es complejo y siempre va hacer dificil de configurar solo para que veas un ejemplo mira la especificaion antigua de ejb eso si que no se lo deseo ni a mi peor enemigo

tu configuracion xml no es recomendable mejor

<bean id="exampleBean" class="examples.ExampleBean">
  <constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
  <constructor-arg ref="yetAnotherBean"/>
  <constructor-arg type="int" value="1"/>
</bean>

<bean id="anotherExampleBean" class="examples.AnotherBean"/>
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>


public class ExampleBean {

    private AnotherBean beanOne;
    private YetAnotherBean beanTwo;
    private int i;
   
    public ExampleBean(
        AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {
        this.beanOne = anotherBean;
        this.beanTwo = yetAnotherBean;
        this.i = i;
    }
}


el problema es que tratas de relacionar un bean con una clase en el xml lo que tienes que hacer es que un bean se relacione con los otros beans

es decir no solo relacionas el nombre de un bean con una clase si no tambien relacionas sus dependencias con el nombre de otro bean

en el ejemplo que tu mismo estas creando 2 beans por las puras solo Debes creas el objA bien instanciado con todas sus dependencias ya descritas dentro del archivo xml no es necesario que crees el ObjB por que ya tines el objA con sus dependencias ya puestas

<beans>
        <bean id="ClaseB" class="B"></bean>
   <bean id="ClaseA" class="A">
            <property name="DependenciaB">
                   <idref bean="ClaseB" />
            </property>
         </bean>
</beans>

no te aseguro que funcione el codigo por que no tengo las erramientas para comprobarlo de todas maneras te paso el link donde explica como hacerlo

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-collaborators

crea una clase que tenga el nombre de ApliacionDeAlgo que este con todas sus dependencias descritas en el xml de tal manera que cuando le pidas a spring que te lo instancie ya lo tienes con todas sus depedensias puestas de tal manera que este operativo y funcional y este listo para la batalla y que no necesite que le pongas todas sus dependencias pidiendole a spring una por una y juntandola todas ademas esa clase deve tener un metodo llamado lansar tu metodo main solo deve tener una la una instancia de tu apliacion y luego deve llamar al metodo lansar y si todo sala ok tu apliacion deve estar funcionando(mostrandote el login o el formulario prinicpal)
el metodo main a lo mucho deve tener 4 lineas en el peor de los casos


aca tienes un ejemplo funcionado disculpa que sea grande y complejo y que uso muchos patrones dificiles de enetender si recien comiensas pero estoy sin tiempo ni erramientas asi que solo te puedo dejar un link

http://www.atomicobject.com/files/presenter_first_adapter_example.zip