example - table swing java
Primavera @ Uso automático (9)
Éstos son algunos de experiencia
Pros
- Facilita la configuración porque solo podemos usar la anotación @Autowire
- No quiero usar métodos setter, así que la clase estará más limpia
Contras
- Juntar firmemente a un archivo xml a pesar de que estamos usando DI
- Implementación difícil de encontrar (pero si está utilizando buenos ides como intellij, puede deshacerse de esto)
A partir de mis experiencias personales, no usé la anotación @AutoWire sino en los casos de prueba.
¿Cuáles son los pros y los contras de usar @Autowired en una clase que será programada por Spring?
Solo para aclarar, estoy hablando específicamente de la anotación @Autowired , no del cableado automático en XML.
Probablemente simplemente no lo entiendo, pero para mí casi parece un antipatrón: sus clases comienzan a darse cuenta de que están vinculadas a un marco DI, en lugar de ser solo POJO. Tal vez soy un glotón para el castigo, pero me gusta tener la configuración XML externa para los beans, y me gusta tener cableados explícitos, así que sé exactamente qué está conectado a dónde.
A mi entender, @Autowired es el mejor para usar, mientras que consulte la referencia de la interfaz y use sus funciones de anulación, pero solo encuentro un problema con esto es que a veces se asigna a nulo en tiempo de ejecución.
Durante mucho tiempo creí que había un valor en tener una "configuración centralizada y declarativa" como los archivos xml que todos solíamos usar. Luego me di cuenta de que la mayoría de las cosas en los archivos no estaban configuradas , nunca se cambió en ningún lugar después del desarrollo, nunca. Entonces me di cuenta de que "centralizado" solo tiene valor en sistemas bastante pequeños; solo en sistemas pequeños alguna vez podrá asimilar un archivo de configuración en su totalidad . ¿Y cuál es realmente el valor de comprender el cableado como un todo, cuando los mismos "cableados" están duplicados en su mayoría por dependencias en el código? Así que lo único que he guardado son los metadatos (anotaciones), que todavía son un poco declarativos. Estos nunca cambian en tiempo de ejecución y nunca son datos de "configuración" que alguien cambiará sobre la marcha, por lo que creo que mantenerlos en el código es bueno.
Uso todo el cableado automático tanto como puedo. Me encanta. No volveré a la antigua primavera a menos que me amenacen a punta de pistola. Mis razones para preferir totalmente @Autowired
han cambiado con el tiempo.
En este momento, creo que la razón más importante para usar el cableado automático es que hay una abstracción menos en su sistema para realizar un seguimiento. El "nombre del grano" ha desaparecido. Resulta que el nombre del bean solo existe debido a xml. Por lo tanto, una capa completa de direccionamientos abstractos (donde se debería conectar el nombre de bean "foo" a la "barra" de bean) se ha ido. Ahora conecto la interfaz "Foo" a mi bean directamente, y la implementación se elige por el perfil de tiempo de ejecución. Esto me permite trabajar con código al rastrear dependencias e implementaciones. Cuando veo una dependencia automática en mi código, solo puedo presionar la tecla "ir a implementación" en mi IDE y luego aparece la lista de implementaciones conocidas. En la mayoría de los casos, solo hay una implementación y estoy directamente en la clase. No puedo ser más simple que eso, y siempre sé exactamente qué implementación se está utilizando (afirmo que lo contrario está más cerca de la verdad con el cableado xml: ¡es gracioso cómo cambia su perspectiva!)
Ahora puede decir que es solo una capa muy simple, pero cada capa de abstracción que agregamos a nuestros sistemas aumenta la complejidad. Realmente no creo que el xml haya agregado ningún valor real a ningún sistema con el que haya trabajado.
La mayoría de los sistemas con los que he trabajado solo tienen una configuración del entorno de tiempo de ejecución de producción. Puede haber otras configuraciones para la prueba y así sucesivamente.
Yo diría que el cableado automático completo es el rubí sobre rieles de la primavera: abarca la idea de que hay un patrón de uso normal y común que la mayoría de los casos de uso siguen. Con la configuración XML, usted permite una gran cantidad de uso de configuración consistente / inconsistente que puede o no estar destinado. He visto que tanta configuración xml es exagerada con inconsistencias, ¿se refacta junto con el código? El pensamiento no. ¿Son esas variaciones por una razón? Usualmente no.
Apenas utilizamos calificadores en nuestra configuración y encontramos otras formas de resolver estas situaciones. Esta es una clara "desventaja" con la que nos encontramos: hemos cambiado ligeramente la forma en que codificamos para que interactúe de forma más sencilla con el cableado automático: un repositorio de clientes ya no implementa la interfaz genérica del Repository<Customer>
pero creamos una interfaz Repository<Customer>
CustomerRepository
que extiende el Repository<Customer>
. A veces también hay un truco o dos cuando se trata de subclases. Pero por lo general, solo nos apunta en la dirección de una tipificación más fuerte, lo que encuentro es casi siempre una solución mejor.
Pero sí, estás ligado a un estilo particular de DI que la mayoría de las veces hace la primavera. Ya ni siquiera hacemos ajustes públicos para dependencias (por lo que podría argumentar que estamos +1 en el departamento de encapsulación / ocultamiento de información). Todavía tenemos algunos xml en nuestro sistema, pero el xml básicamente solo contiene las anomalías. El cableado automático completo se integra muy bien con xml.
Lo único que necesitamos ahora es que @Component
, @Autowired
y el resto se incluyan en un JSR (como JSR-250 ), por lo que no tenemos que vincularnos con la primavera. Así es como han estado sucediendo las cosas en el pasado (me java.util.concurrent
a la mente las cosas de java.util.concurrent
), por lo que no me sorprendería del todo si esto volviera a suceder.
Estamos cambiando de @Autowire a la configuración XML en nuestro gran proyecto. El problema es muy bajo rendimiento bootstrap. El escáner de Autowiring carga todas las clases desde la ruta de clase de búsqueda de autowiring, por lo tanto, muchas clases se cargan con entusiasmo durante la inicialización de Spring.
Ha habido muy poca discusión sobre el cambio de entornos. La mayoría de los proyectos en los que he trabajado fue un problema real para inyectar dependencias según el entorno en el que estemos trabajando. Con xml config es bastante sencillo con Spring EL, y no conozco ninguna buena solución con anotaciones. Acabo de descubrir uno:
@Value("#{${env} == "production" ? realService : dummyService}")
private SomeService service;
Debería estar funcionando, pero no es una buena solución imho.
He cambiado a @Autowire. Mantener la configuración XML en cualquier otra cosa que no sea un proyecto pequeño se convirtió en una tarea por derecho propio y la comprensión se degradó rápidamente.
IntelliJ proporciona un buen soporte (no perfecto) para las anotaciones de primavera.
Mi opinión sobre este tema es que, la configuración xml reduce la claridad del código, especialmente en sistemas grandes.
Anotaciones como @Component empeoran las cosas. Dirige a los desarrolladores a hacer que los objetos sean mutables, ya que las dependencias ya no pueden finalizarse, dado que es necesario proporcionar constructores predeterminados. Las dependencias deben ser inyectadas a través del establecimiento público o no controladas a través de @Autowired. [incluso la inyección de dependencia peor se ve comprometida con las clases que instancian sus dependencias, ¡todavía veo esto en el código recién escrito!]. Quiero decir, sin control, en sistemas grandes, cuando hay disponibles varias implementaciones (o versiones secundarias) del tipo, es mucho más complicado comprender cuál de las implementaciones fue @Autowired, una complejidad que hace que la investigación de errores sea mucho más difícil. También significa que, supuestamente tiene un perfil para el entorno de prueba y otro para la producción, sus errores de producción solo sucederán cuando más les duele, en la producción, en lugar de poder detectar los errores en el entorno de prueba, o incluso mejor, en ¡tiempo de compilación!
Me mantengo en el terreno intermedio donde declaro mi (s) clase (s) de configuración, (configuración Spring basada en Java usando @Configuration)
Declaro todos mis beans explícitamente en la (s) clase (s) de configuración. Solo uso @Autowired en la (s) clase (s) de configuración, el propósito es limitar la dependencia de Spring a la (s) clase (s) de configuración
La configuración @ reside en un paquete específico, que es el único lugar donde se ejecuta el análisis de primavera. (Eso acelera sustancialmente el tiempo de inicio en grandes proyectos)
Me esfuerzo por hacer que todas mis clases sean inmutables, especialmente el objeto de datos, JPA, Hibernate y Spring, así como muchas bibliotecas de serialización que parecen socavar esto. Me alejo de cualquier cosa que me obligue a proporcionar establecedores o eliminar la palabra clave final de mi declaración de propiedad.
Reducir las posibilidades de cambiar objetos después de que se crean, reduce sustancialmente los errores en un sistema grande y reduce el tiempo para encontrar un error cuando existe uno.
También parece que obliga al desarrollador a diseñar mejor la interacción entre las diferentes partes del sistema. Los problemas y los errores se convierten cada vez más en errores de compilación, lo que reduce el tiempo perdido y mejora la productividad.
Para mí aquí es lo que me gusta / no me gusta de Spring y el cableado automático.
Pros:
- El cableado automático elimina la desagradable configuración XML.
- Anotaciones mucho más fáciles de usar que le permiten inyectar directamente usando campos, métodos de establecimiento o constructores. También le permite anotar y "calificar" sus frijoles inyectados.
Contras:
- El uso del cableado automático y las anotaciones lo hacen dependiente de las bibliotecas Spring, ya que, al igual que con la configuración XML, puede ejecutar con o sin Spring. Como dijiste, te atas a un marco DI.
- Al mismo tiempo, me gusta poder "calificar" los beans, para mí esto hace que el código sea realmente desordenado. Si necesita inyectar el mismo bean en varios lugares, he visto el mismo nombre de cadena repetido por todas partes. Para mí esto parece tener el potencial de errores.
Comencé a usar el cableado automático casi exclusivamente en el trabajo porque dependemos tanto de la integración de Spring de todos modos que el problema de la dependencia es discutible. Trabajé en un proyecto de Spring MVC que usaba el cableado automático de manera extensiva y fue un poco difícil envolver mi cabeza.
Creo que el cableado automático es un gusto adquirido, una vez que te acostumbras a él, te das cuenta de lo poderoso, fácil y mucho menos complicado de trabajar que con la configuración XML.
Realmente me encanta escribir con anotaciones, en lugar de XML. De acuerdo con el manual de Spring y las últimas versiones, XML y Annotation lograron el mismo resultado.
Esta es mi lista
Pro:
- Eliminar línea inútil de XML
- Simplifique la depuración del código: cuando abre una clase, puede leer lo que tiene en la clase
- Un desarrollo más rápido, ¿se puede leer un proyecto con 400 o más líneas de XML?
Contras:
- No es una implementación estándar de Java, pero puedes cambiar a usar @Inject, que es una Java Standard Api, para que el bean siga siendo un Pojo
- No se puede usar simplemente en todas partes, db connection e etc., pero es solo una opinión, prefiero tener un lugar donde leer toda la configuración.