¿Cuál es la diferencia entre crear un objeto nuevo y una inyección de dependencia? Por favor explique en detalle.Diferencia entre la creación de un nuevo objeto y la inyección de dependencia
Respuesta
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 ...
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.
sugieren algún tipo de relación .. – TaherT
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.
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:
ejemploclass 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.
Acabo de iniciar sesión para votar esto, es mucho mejor que el artículo aceptado y explicar que es una manera adecuada. – Anearion
¿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
@Yoda, agregó una descripción de cómo hacer la inyección real. Espero que ayude. – thoni56
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.
- 1. ¿Cuál es la diferencia entre la inversión de control y la inyección de dependencia en C++?
- 2. ¿Cuál es la diferencia entre el patrón de estrategia y la inyección de dependencia?
- 3. La inyección de dependencia y la fábrica
- 4. Logging Spring Bean creación/inyección de dependencia
- 5. Inyectando el Inyector de Dependencia usando la Inyección de Dependencia
- 6. ¿Diferencia entre asociación y dependencia?
- 7. Cuál es la diferencia entre Propiedad y Propiedad de Dependencia
- 8. inyección WCF La dependencia y la fábrica de resumen
- 9. La inyección de dependencia con múltiples repositorios
- 10. Usa correctamente la inyección de dependencia
- 11. Unity [dependencia] inyección y Herencia
- 12. ¿Cuándo usa la inyección de dependencia?
- 13. ASMX inyección de dependencia y de la COI
- 14. inyección de dependencia y el desarrollo de la productividad
- 15. inyección de dependencias, la inyección de un objeto "inyectable" (servicio) en un newable (entidad)
- 16. Diferencia entre objeto y *?
- 17. Usar la inyección de dependencia para Properties.Settings.Default?
- 18. Inyección de dependencia sin marco
- 19. ¿La inyección de dependencia infringe la Ley de Demeter
- 20. ¿Cuál es la diferencia entre agregación, composición y dependencia?
- 21. ¿Qué es la Inyección de Dependencia?
- 22. ¿Diferencia entre un objeto y un hash?
- 23. ¿Cuál es la diferencia entre nuevo en un constructor y nuevo en una declaración de miembro?
- 24. ¿Diferencia entre un objeto y un diccionario?
- 25. Symfony 2: inyección de dependencia y rasgos
- 26. MVC, DI (inyección de dependencia) y creación de instancia de modelo desde el controlador
- 27. ¿Cuál es la diferencia entre una matriz y un objeto?
- 28. Cuál es la diferencia entre un subproceso y un controlador
- 29. ¿Cuál es la diferencia entre una instancia y un objeto?
- 30. ¿Cuál es la diferencia entre la creación de un nuevo ModelAndView o pasar en un modelo como parámetro del método
¿Cómo es eso diferente de utilizar un Singleton? – Radu
@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
¿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