injection dependency bean annotation java spring configuration dependency-injection annotations

java - dependency - Spring DI-based basado en vs xml configuración?



spring constructor injection annotation (5)

Algunas ventajas de usar la configuración XML :

  1. La configuración XML está en un lugar, en lugar de estar dispersa en todo el código fuente en el caso de las anotaciones. Algunas personas pueden argumentar que los IDEs como STS le permiten ver todas las anotaciones basadas en la configuración en un solo lugar, pero nunca me gusta tener dependencias en IDEs.
  2. Lleva un poco más de esfuerzo escribir configuraciones XML, pero ahorra mucho tiempo más tarde cuando busca dependencias e intenta comprender el proyecto.
  3. XML mantiene la configuración bien organizada y simple. Por lo tanto, es más fácil de entender, ayuda a los nuevos miembros del equipo relativamente inexpertos a ponerse al día rápidamente.
  4. Le permite cambiar la configuración sin necesidad de volver a compilar y volver a implementar el código. Entonces es mejor, cuando se trata de soporte de producción.

Entonces, en pocas palabras, la configuración XML requiere un poco más de esfuerzo, pero le ahorrará mucho tiempo y dolor de cabeza en los grandes proyectos.

Recientemente en nuestro equipo comenzamos a discutir el uso de anotaciones de primavera en el código para definir las dependencias de primavera. Actualmente estamos usando context.xml para definir nuestras dependencias. ¿Me daría algunas pistas para cualquiera de los enfoques, y cuando uno es mejor para ser utilizado?

Editar: Sé que parece una pregunta duplicada a una más general, pero me interesan los impactos de las anotaciones versus la configuración solo para la inyección de dependencia, que creo que tendría respuestas y actitudes diferentes a la pregunta general.


Desde mi propia experiencia, las anotaciones son mejores que la configuración xml. Creo que, en cualquier caso, puedes anular xmls y usar anotaciones. Además, Spring 4 nos brinda un gran soporte para las anotaciones, podemos anular la seguridad de xml a anotaciones, etc., así que no tendremos 100 líneas xml sino 10 líneas de código Java.


Después de leer algunas publicaciones relacionadas aquí y de tener más discusiones en el equipo, llegamos a las siguientes conclusiones. Espero que sea útil para otros aquí.

Acerca de la configuración XML (que estamos utilizando hasta ahora), decidimos mantenerla para las dependencias que son para bibliotecas (ya sea que las desarrollemos nosotros o terceros). Por definición, las bibliotecas solo deben proporcionar cierta funcionalidad y se pueden usar en varios escenarios, que pueden no implicar DI. Por lo tanto, usar anotaciones en nuestros proyectos de biblioteca traerá dependencias del marco DI (Spring en nuestro caso) a la biblioteca, y esto sería inútil cuando la biblioteca se usa sin DI. Tener dependencias adicionales no se considera una buena práctica entre nuestro equipo (en general, en mi humilde opinión). Cuando estamos ensamblando una aplicación, la aplicación tiene las dependencias DI necesarias y la inyección de clases de la biblioteca se realiza por configuración. XML también es bueno para proporcionar implementaciones simuladas para muchos componentes, sin recompilar los módulos que los usarán. Esto nos da flexibilidad al probar o ejecutar en un entorno local o de producción.

Con respecto a las anotaciones , decidimos que podemos beneficiarnos al usarlas cuando los componentes inyectados no variarán, pero no habrá escenarios en los que se utilicen diferentes implementaciones de un componente. Decidimos que las anotaciones serán muy útiles para pequeños módulos / aplicaciones con una funcionalidad clara, que no cambiará o admitirá diferentes implementaciones. Esos módulos casi podemos usarlos de manera predeterminada en diferentes proyectos, sin escribir el tedioso XML. Sin embargo, acordamos que estos módulos deberían tener las dependencias descritas en nuestra documentación técnica, de modo que al armar toda la aplicación, uno pueda tener una idea de estas dependencias sin desplazarse por el código, o incluso cargar el módulo en el IDE. Aún así, parece que las anotaciones requerirán que el módulo esté un poco maduro sobre qué dependencias usará. Esto también es aplicable para las configuraciones de clases de Java, que es la alternativa Spring moderna de contextos XML.

En general, si nuestras dependencias pueden variar para diferentes escenarios, o un módulo puede usarse con diferentes componentes, decidimos mantener el XML y no codificar ninguna dependencia en dicho módulo. Claramente, DEBE haber un equilibrio correcto entre ambos enfoques, y una idea clara para los usos.

Una actualización importante con respecto al enfoque mixto. Recientemente tuvimos un caso con un marco de prueba que creamos para nuestro equipo de control de calidad, que requería dependencias de otro proyecto. El marco fue diseñado para usar el enfoque de anotación y las clases de configuración de Spring, mientras que el proyecto al que se hace referencia tiene algunos contextos xml a los que necesitábamos hacer referencia. Desafortunadamente, las clases de prueba (utilizamos org.testng con soporte de primavera) solo podían funcionar con clases de configuración xml o java, no con ambas.

Esta situación ilustra un caso donde ambos enfoques chocarían y, claramente, uno debe descartarse. En nuestro caso, migramos el marco de prueba para usar contextos primaverales xml, pero otros usos podrían implicar lo contrario.


Mire esta respuesta aquí: configuración Xml versus configuración basada en anotación

Una breve cita directamente desde allí:

Las anotaciones tienen su uso, pero no son la única bala para eliminar la configuración XML. ¡Recomiendo mezclar los dos!

Por ejemplo, si usa Spring, es completamente intuitivo usar XML para la porción de inyección de dependencia de su aplicación. Esto aleja las dependencias del código del código que lo usará, por el contrario, al usar algún tipo de anotación en el código que necesita las dependencias, el código toma en cuenta esta configuración automática.

Sin embargo, en lugar de usar XML para la gestión transaccional, marcar un método como transaccional con una anotación tiene mucho sentido, ya que esta es información que un programador probablemente desearía saber.

EDITAR: También, mira las respuestas aquí: Inyección de Java Dependency: XML o anotaciones Lo más probable es que se dirijan al área de tu interés mucho mejor.


desde mi experiencia, preferiría (o más bien me veo forzado por las limitaciones) usar una combinación de DI basado en anotaciones y XML. Si necesito inyectar un Mapa de elementos dentro de un bean, tendría que definir un util: map y auto-conectarlo. Además, necesito usar XML DI para inyectar una fuente de datos en sessionFactory si tengo varias fuentes de datos, etc. Entonces una combinación de ambos sería correspondida.

Prefiero el uso de componentes escaneados para autodetectar los servicios y Dao. Esto reduce una gran cantidad de configuración (reducimos los archivos de configuración en aproximadamente un 50% cambiando a escaneo de componentes). La DI basada en anotaciones admite tanto ByName (@Resource) como byType (@Autowired).

En resumen, mi consejo es que sea un accesorio de ambos. Siento que más soporte de anotación definitivamente estará en las tarjetas en los próximos lanzamientos de primavera.