Qué es exactamente la daga y cómo funciona

Sé que esto puede no ser la forma correcta de hacer la pregunta, pero después de leer mucho y mucho todavía estoy confundido acerca de las dagas y cómo funciona y por qué debemos usarlo. Desde su uso en mi actual proyecto de trabajo. Por favor, alguien me dé una pequeña pista en palabras sencillas cuál es el propósito de la daga será muy útil.

Gracias

Dagger es un marco de inyección de dependencia JSR-330 basado en anotaciones Java .

¿Qué es la inyección de dependencia?

La inyección de dependencia (a veces denominada Inversión de Control o IoC) se basa en la idea de que una clase dada no debería necesitar saber cómo crear o proporcionar las clases de las que depende. Proporcionar esas dependencias debe ser responsabilidad del usuario de la clase (o de una clase o fábrica separada).

Por ejemplo, supongamos que tiene clase A que depende de la clase B , que depende de las clases C y D (En términos reales, puede ser una Aplicación, que depende de una BusinessLogicClass, que depende de una Calculadora y una Base de Datos). Podría ser así:

 class A { private B b = new B(); } class B { private C c = new C(); private D d = new D(); } 

… pero en ese punto sería muy difícil usar un C o D diferente (calculadora o base de datos), incluso su B (clase de lógica empresarial) debería funcionar con una variedad de fuentes de datos, o si necesita reemplazar cualquiera de Las piezas para las pruebas unitarias. La inyección de la dependencia, como un concepto, dice que usted debe poder pasar en dependencias en las clases cuando usted los crea.

 A a = new A(new B(new C(), new D())); // Now you get an A, but can replace any part of it. 

¿Qué es un marco de inyección de dependencia?

Un marco de inyección de dependencias crea automáticamente fábricas para todas sus clases, por lo que puede crear un A sin preocuparse por sus dependencias o dependencias de sus dependencias.

 A a = new AFactory().getA(); // Equivalent to the above, but easier! 

Los marcos de inyección de dependencia usualmente vienen con un lenguaje para especificar mapeos, a menudo llamados enlaces , que es sólo una forma de instruir que se debe crear un EImpl cuando una clase pide un EInterface o un FSubclass cuando una clase pide FClass . Este idioma también le permite elegir cuándo crear nuevas instancias: En cada solicitud, una vez en toda la aplicación ("singleton") o de otra forma. Spring utiliza XML y Guice utiliza un lenguaje de clases Java personalizado para esto; Dagger utiliza interfaces, clases y anotaciones Java.

Puede hacer la inyección de dependencia sin un contenedor o marco, pero la mayoría de las veces la gente piensa en un marco como Spring, Guice o Dagger cuando menciona la inyección de dependencia. Estos marcos automatizan lejos muchos de los new boilerplate usted ve arriba, que podría de otra manera hacer la inyección de la dependencia "manual" difícil de trabajar con.

¿Qué hay de JSR 330?

Java normalizó algunas interfaces y anotaciones como "JSR 330" para facilitar el cambio entre los frameworks de inyección de dependencias y para facilitar la escritura de bibliotecas que funcionan en cualquier framework. Como Spring y Guice, Dagger se ajusta a este estándar.

¿Por qué es una gran cosa que Dagger es tiempo de compilación?

Otros frameworks de inyección de dependencia, incluyendo Spring y Guice, hacen su configuración en tiempo de ejecución : Usan la reflexión de Java para inspeccionar los constructores, métodos y campos de las clases. Esto puede ser lento en la producción en servidores y escritorios, y es extremadamente lento en Android debido a las diferencias de VM y las limitaciones de memoria / procesador móviles. En consecuencia, los equipos de Square y Google escribieron Dagger y Dagger 2 para usar el procesamiento de anotaciones Java para inspeccionar las clases en tiempo de compilación y escribir automáticamente código Java estándar para objetos Java simples para actuar como las fábricas anteriores. Debido a que esto es Java sin reflexión, puede ser mucho más rápido en Android y sistemas embebidos, y puede ser optimizado utilizando las herramientas existentes.

Tenga en cuenta, además, que Dagger fue escrito en Square por Bob Lee (quien originalmente escribió Guice en Google); El proyecto Dagger 2 es la reescritura de Dagger mantenido en Google que cambia algunos de los detalles sobre cómo configurar Dagger y cómo evitar el uso de la reflexión. Tanto Dagger como Dagger 2 son marcos de inyección de dependencia basados ​​en anotaciones en tiempo de compilación para Java, pero son un poco diferentes entre sí.

  • Dagger - android.app.IntentService con @Inject
  • Dagger2 y Android
  • Inyectar base de datos en un ContentProvider con daga
  • Dagger2 Component (un-scoped) no puede depender de los componentes del ámbito - Error
  • Dagger 2 inyectar parámetros del constructor
  • ¿La manera más simple de crear un Singleton w / Dagger 2?
  • Daga que no genera componentes para / clase de prueba
  • Adición de clases sin actividad a Dagger 2 Graph Android
  • Dagger2: Error cuando dos componentes tienen la misma firma de método de inyección
  • Dagger 2: Inyectar el parámetro introducido por el usuario en el objeto
  • ¿Es posible usar Dagger en el proyecto de la biblioteca?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.