Inyección de dependencia de Java: Dagger 1 vs Dagger 2, que es mejor?

¿Cuáles son las ventajas de Dagger 2 sobre Dagger 1 ?

Hasta ahora he encontrado (sólo) 2:

  • Dagger 2 le permite usar la ofuscación de código con proguard
  • Dagger 2 es más rápido (que no es una gran ventaja cuando se utiliza para la aplicación de Android, pero es seguro que una cosa importante si se utiliza para algún tipo de servidor)

Al mismo tiempo, encontré una gran desventaja: no puedes tener modificaciones en el módulo ( @Module(overrides = true) ) en Dagger 2, que es en gran parte molesto al menos para mí – fue muy útil para la prueba de unidad.

¿Hay otras ventajas / desventajas?

Algunas ventajas y desventajas de https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/ y http://google.github.io/dagger/dagger-1 -migration.html :

Ventajas de Dagger 2:

  • No más reflexión – todo se hace como llamadas concretas (ProGuard trabaja sin ninguna configuración en absoluto)
  • No más composición de gráfico de tiempo de ejecución – mejora el rendimiento, incluidos los casos por solicitud
  • Trazable – código mejor generado y sin reflexión hacen que el código sea legible y fácil de seguir
  • Apoya la inyección del método además de la inyección del campo y del constructor que eran los únicos dos tipos apoyados por Dagger 1
  • Los módulos requieren menos configuración que Dagger 1
  • Permite a los usuarios utilizar cualquier anotación de ámbito bien formada. Dagger 1 sólo soportaba un solo ámbito: @Singleton .

Y desventajas:

  • El método inject() tiene ahora una asociación de tipo fuerte con el objetivo de inyección. Esto es bueno para la depuración, pero complica una práctica común de inyección de clases base (por ejemplo, actividades de base, fragmentos, etc.).
  • La implementación del componente requiere reconstruir el proyecto para que aparezca y cualquier error de compilación relacionado con la inyección da como resultado la desaparición de la clase (es decir, no se genera).
  • No admite overrides . Los módulos que reemplazan a falsificaciones simples pueden crear una subclase del módulo para emular ese comportamiento. Los módulos que usan anulaciones y dependen de la inyección de dependencia deben descomponerse de manera que los módulos de invalidación se representen como una opción entre dos módulos.

EDIT 2016/11/16: Esto no es una ventaja técnica, pero Dagger 1 ahora está obsoleto (a partir del 15 de septiembre de 2016) y ya no será desarrollado activamente. Se recomienda migrar a Dagger 2.

No recomendaría tener un vistazo a palillo .

Como co-autor, estoy obviamente más sesgada, pero sí este es mucho más simple de usar, al menos tan rápido en la mayoría de los casos que las dagas. Y realmente el árbol de ámbito es una forma muy poderosa de desarrollar funciones más avanzadas como reciclar instancias en ámbitos que abarcan múltiples actividades.

  • Cómo ejecutar la antigua aplicación java en Android
  • Cómo generar un entero con los métodos de TextView?
  • ¿Cuál es el uso de la nueva String en toArray (new String );
  • ¿Cómo extender la clase de URL para soportar otros protocolos en java (android)?
  • Android: no se puede iniciar la intención de servicio: ¿no se encuentra?
  • Cómo utilizar Tostadas cuando no puedo usar "esto" como contexto
  • ¿Recurso Android no encontrado excepción?
  • ¿Qué tipo de constructor es este, comenzando con <T extends Drawable & DrawerToggle>?
  • Picasso sigue recargando imágenes mientras se desplaza hacia arriba en listview, carga lentamente
  • N-Puzzle pseudo-aleatorio barajar?
  • ¿cuál es el significado de "this.this $ 0"?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.