java - dependencias - dagger android
¿Por qué usar/desarrollar Guice, cuando tienes Spring y Dagger? (1)
Que yo sepa, Dagger genera código, mientras que Guice y Spring confían en el procesamiento en tiempo de ejecución, por lo que Dagger funciona más rápido, pero requiere más trabajo en el lado del programador. Debido a la ventaja de rendimiento, es bueno para el desarrollo móvil (Android).
Sin embargo, cuando nos quedamos con Guice y Spring, este último tiene muchas integraciones. ¿Cuál es el punto de desarrollar / usar Guice, si podemos usar Spring Framework (que básicamente hace lo mismo, pero ofrece, por ejemplo, un acceso más fácil a la base de datos)?
¿Google no está tratando de reinventar la rueda al crear su propia herramienta de DI, en lugar de usar (y posiblemente contribuir a) Spring Framework?
Estoy buscando el árbol de decisiones, que guía a través de la elección de la herramienta DI.
Es importante darse cuenta de que Dagger fue creado después de Guice, por uno de los creadores de Guice ( "Crazy Bob" Lee ) que se había mudado a Square:
- La primavera se lanzó originalmente en octubre de 2002 .
- Google lanzó originalmente Guice públicamente en marzo de 2007 .
- JSR-330 formalizó
javax.inject
anotaciones dejavax.inject
en octubre de 2009 , con una gran contribución de Google (Bob Lee), Spring y otros actores de la industria. - Square lanzó originalmente Dagger 1 públicamente en mayo de 2013 .
- Google lanzó originalmente Dagger 2 públicamente en abril de 2015 .
- El 15 de septiembre de 2016, el cuadrado marcó la Daga 1 como obsoleta 10 días antes de que se hiciera esta pregunta.
En ese sentido, la curación continua de Guice no es "reinventar la rueda" sino más bien el mantenimiento de un paquete de software de larga duración y ampliamente consumido que es anterior a cualquier versión de Dagger. Podría considerar que Dagger es un sucesor espiritual de Guice, pero que solo ofrece un subconjunto optimizado de la funcionalidad de Guice.
Para enumerar y enmendar las diferencias que tiene arriba:
- Spring es un marco de trabajo relativamente pesado con muchas integraciones, un lenguaje de configuración XML y enlaces de tiempo de ejecución / reflexivos. Las aplicaciones que ya utilizan Spring pueden usar el marco de inyección de dependencias de Spring con muy poco trabajo adicional.
- Guice es un marco relativamente liviano con menos integraciones, configuración de instancias de Java y enlaces de tiempo de ejecución / reflexivos. Con el uso de los enlaces de Java, obtiene la verificación de tipos en tiempo de compilación y la integración de autocompletado IDE.
- Dagger es un marco muy ligero con muy pocas integraciones, interfaz de Java / configuración de anotación y enlaces generados por código en tiempo de compilación. El aspecto de generación de código hace que Dagger sea muy eficaz en general y particularmente en entornos móviles y con recursos limitados. (Las máquinas virtuales de Android difieren de los JRE de servidor en formas que hacen que la reflexión sea especialmente lenta, por lo que Dagger es especialmente útil aquí).
- Los tres marcos anteriores son compatibles con JSR-330, por lo que una biblioteca o aplicación bien diseñada puede ser mayoritariamente independiente del contenedor DI utilizado.
Más allá de eso, preste atención a los patrones y políticas de mantenimiento / desaprobación entre cualquier marco que use. Con base en el conocimiento y la experiencia de su equipo, su necesidad de reflexión o configuración en tiempo de ejecución, y su necesidad de integraciones y rendimiento en tiempo de ejecución, probablemente verá una de las anteriores. Dicho esto, también hay otros marcos por ahí, así que manténgase atento a las nuevas opciones y las opciones de las anteriores.