2010-08-02 14 views

Respuesta

11

Bueno, crear un nuevo objeto es lo más explícito posible: crea una nueva instancia de la clase deseada.

Inyecciones de dependencia es un mecanismo que le proporciona referencias donde las necesita. Imagine una clase que represente un conjunto de conexiones a su base de datos; generalmente solo tiene una instancia de esa clase. Ahora necesita distribuir esa referencia a todas las clases que la usan. Aquí es donde la Inyección de Dependencia es útil: al usar un marco DI como Spring, puede definir que la única instancia de su grupo se inyecte en las clases que lo necesitan.

Su pregunta en sí no es fácil de responder desde la creación de un objeto y la inyección de dependencia no se puede comparar con tanta facilidad ...

+2

¿Cómo es eso diferente de utilizar un Singleton? – Radu

+0

@Radu un Singleton es un patrón de diseño que restringe el número de instancias de una clase específica a un máximo de uno. Entonces, la creación de la instancia es parte de la implementación del patrón. El singleton no se inyecta en los lugares donde lo necesita, para eso necesita inyección de dependencia. – f1sh

+1

¿Cómo es que esa única instancia de la clase que se instancia y distribuye "mágicamente" mejor que llamar a SingletonClass.getSingleInstance() es mi pregunta. Esta inyección de dependencia parece redundante para mí si solo tiene 1 instancia, solo use el patrón singleton. – Radu

2

Al usar un contenedor de inversión de control para realizar la inyección de dependencia, el contenedor crea los objetos, no el desarrollador. Esto se hace para que el contenedor pueda "inyectar" estos objetos en otros objetos.

Le sugiero que lea algunos artículos sobre la inyección de dependencia y/o la primavera. O lea otros temas sobre la inyección de dependencia aquí en SO.

+0

sugieren algún tipo de relación .. – TaherT

13

Por supuesto, tanto crear objetos. La diferencia está en quién es responsable de la creación. ¿Es la clase que necesita sus dependencias o un contenedor como Spring por ejemplo, que conecta las dependencias de los componentes? Configura las dependencias en un archivo de configuración separado (típicamente XML).

Es realmente una separación de preocupaciones. La clase dice que necesito esto, este y este componente para que funcione adecuadamente. A la clase no le importa cómo obtiene sus componentes. Los conecta a la clase con un archivo de configuración separado.

Para dar un ejemplo, consideremos tener una clase de compras que necesita un módulo de pago. No desea codificar qué módulo de pago se utilizará. Para lograr esto, invierte el control. Puede cambiar el módulo de pago usado con unas pocas teclas en el archivo de configuración del contenedor. El poder es que no está tocando ningún código Java.

9

Bueno, no son exactamente comparables. Siempre tendrá que crear un nuevo objeto instanciando una clase en algún punto. La inyección de dependencia también requiere la creación de nuevos objetos.

La inyección de dependencia realmente entra en juego cuando desea controlar o verificar el comportamiento de las instancias utilizadas por una clase que utiliza o desea probar. (Para la inyección de dependencia de desarrollo impulsado por prueba es clave para cualquier, excepto el ejemplo más pequeño).

Suponga un sujetador de clase que requiere un objeto de clase Handle. La forma tradicional de hacer eso sería dejar que la instancia Holder crear y lo propio:

ejemplo
class Holder { 
    private Handle myHandle = new Handle(); 
    public void handleIt() { 
     handle.handleIt(); 
    } 
} 

el titular crea myHandle y nadie fuera de la clase puede llegar a ella. En algunos casos, la prueba unitaria es una de ellas, esto es un problema porque no es posible probar la clase Holder sin crear la instancia de Handle, que a su vez puede depender de muchas otras clases e instancias. Esto hace que las pruebas sean difíciles de manejar y engorrosas.

Al inyectar el identificador de instancia, por ejemplo en el constructor, alguien desde el exterior se hace responsable de la creación de la instancia.

class Holder { 
    private Handle myHandle; 

    public Holder(Handle injectedHandle) { 
     myHandle = injectedHandle; 
    } 

    public void handleIt() { 
     handle.handleIt(); 
    } 
} 

Como se puede ver el código es casi lo mismo, y el mango está siendo privada, pero la clase Holder tiene ahora una gran parte de acoplamiento perdedor a su mundo exterior que hace muchas cosas más simples. Y al probar la clase Holder, se puede inyectar un objeto simulado o stub en lugar de una instancia real, lo que permite verificar o controlar la interacción entre el Titular, su interlocutor y el controlador.

La inyección real tendría lugar en algún otro lugar, por lo general algún programa "principal". Existen múltiples marcos que pueden ayudarle a hacer eso sin necesidad de programación, pero en esencia se trata de un código en el programa "principal":

... 
private Handle myHandle = new Handle(); // Create the instance to inject 
private Handler theHandler = new Handler(myHandle); // Inject the handle 
... 

En esencia, la inyección no es más que un método de fantasía set. Y, por supuesto, puede implementar el mecanismo de inyección usando eso en lugar de hacerlo en el constructor como en el ejemplo simple anterior.

+0

Acabo de iniciar sesión para votar esto, es mucho mejor que el artículo aceptado y explicar que es una manera adecuada. – Anearion

+0

¿Pero cómo el 'injectedHandle' se está iniciando fuera de nuestro control cuando creamos un' Holder'? ¿Qué ocurre si hay más parámetros, cómo sabe cómo iniciarlos o si no se inicializa? – Yoda

+0

@Yoda, agregó una descripción de cómo hacer la inyección real. Espero que ayude. – thoni56

1

inyección de dependencias añade una capa de configurabilidad en su aplicación. En el sentido, cuando dura la construcción objeto de código, es necesario reconstruir y volver a implementar su aplicación, pero cuando se utiliza la inyección de dependencias, puede volver a configurar el XML y cambiar el comportamiento sin re-construcción y re-despliegue. Hay una gran variedad de casos de uso donde esto puede ahorrar mucho empate y esfuerzo.

Cuestiones relacionadas