java ejemplo - ¿Cuál es la diferencia entre @Inject y @Autowired en Spring Framework? ¿Cuál usar bajo qué condición?




dependency-injection (9)

@Autowired anotación @Autowired se define en el framework Spring.

@Inject anotación @Inject es una anotación estándar, que se define en el estándar "Inyección de dependencia para Java" (JSR-330) . Spring (desde la versión 3.0) admite el modelo generalizado de inyección de dependencia que se define en el estándar JSR-330. (Los marcos de Google Guice y Picocontainer también son compatibles con este modelo).

Con @Inject se puede inyectar la referencia a la implementación de la interfaz del Provider , que permite inyectar las referencias diferidas.

Anotaciones @Inject y @Autowired - son analogías casi completas. Además de la anotación @Autowired , la anotación @Inject se puede utilizar para propiedades, métodos y constructores de enlace automático.

A diferencia de la anotación @Autowired , la anotación @Inject no tiene ningún atributo required . Por lo tanto, si no se encontrarán las dependencias, se lanzará una excepción.

También hay diferencias en las aclaraciones de las propiedades de unión. Si existe ambigüedad en la elección de los componentes para la inyección, se debe agregar el calificador @Named . En una situación similar para @Autowired se @Autowired anotación @Qualifier qualifier (JSR-330 define su propia anotación @Qualifier y, a través de esta calificación, se define @Named ).

Estoy revisando algunos blogs en SpringSource y en uno de los blogs, el autor usa @Inject y supongo que también puede usar @Autowired .

Aquí está la pieza de código:

@Inject private CustomerOrderService customerOrderService;

No estoy seguro de la diferencia entre @Inject y @Autowired y agradecería que alguien explicara su diferencia y cuál utilizar, ¿en qué situación?


La anotación @Inject es una de las recopilaciones de anotaciones JSR-330. Esto tiene las rutas de ejecución de Coincidencia por tipo, Coincidencia por calificador, Coincidencia por nombre. Estas rutas de ejecución son válidas tanto para el establecimiento como para la inyección de campo. El comportamiento de la anotación @Autowired es el mismo que la anotación @Inject . La única diferencia es que la anotación @Autowired es parte del framework Spring. @Autowired anotación también tiene las rutas de ejecución anteriores. Así que recomiendo el @Autowired para su respuesta.


Para manejar la situación en la que no hay cableado, los beans están disponibles con el @Autowired required @Autowired establecido en false .

Pero cuando se utiliza @Inject , la interfaz del proveedor funciona con el bean, lo que significa que el bean no se inyecta directamente sino con el proveedor.


La diferencia clave (notada al leer Spring Docs ) entre @Autowired y @Inject es que @Autowired tiene el atributo 'obligatorio' mientras que @Inject no tiene ningún atributo 'obligatorio'.


A partir de Spring 3.0, Spring ofrece soporte para las anotaciones de inyección de dependencia JSR-330 ( @Inject , @Named , @Singleton ).

Hay una sección separada en la documentación de Spring sobre ellos, que incluye comparaciones con sus equivalentes de Spring.


Además de lo anterior:

  1. El alcance predeterminado para los frijoles @Autowired es Singleton, mientras que usar la anotación JSR 330 @Inject es como el prototype de Spring.
  2. No hay equivalente de @Lazy en JSR 330 usando @Inject
  3. No hay equivalente de @Value en JSR 330 usando @Inject

Suponiendo que aquí te refieres a las anotaciones javax.inject.Inject . @Inject es parte del estándar Java CDI ( Contexts and Dependency Injection ) introducido en Java EE 6 (JSR-299), lea más . Spring ha optado por admitir el uso de @Inject sinónimo de su propia anotación @Autowired .

Entonces, para responder a su pregunta, @Autowired es la propia anotación (heredada) de Spring. @Inject es parte de una nueva tecnología Java llamada CDI que define un estándar para la inyección de dependencias similar a Spring. En una aplicación de Spring, las dos anotaciones funcionan de la misma manera que Spring ha decidido admitir algunas anotaciones JSR-299 además de las propias.


@Inject no tiene atributo 'requerido'


DI es una técnica o un patrón y no está relacionado con ningún marco. Puedes cablear tus dependencias manualmente. DI lo ayuda con SR (responsabilidad única) y SoC (separación de inquietudes). DI lleva a un mejor diseño. Desde mi punto de vista y experiencia no hay desventajas . Al igual que con cualquier otro patrón, puede equivocarse o utilizarlo de forma incorrecta (pero, en el caso de la DI, es bastante difícil).

Si introduce DI como principio en una aplicación heredada, use un marco: el mayor error que puede hacer es usarlo incorrectamente como un Localizador de Servicios. ¡El marco DI + en sí mismo es genial y solo mejoró las cosas en todas partes que lo vi! Desde el punto de vista de la organización, existen problemas comunes con cada nuevo proceso, técnica, patrón, ...:

  • Tienes que entrenar tu equipo
  • Tienes que cambiar tu aplicación (que incluye riesgos)

En general, tienes que invertir tiempo y dinero , además de eso, ¡no hay inconvenientes, de verdad!





java spring dependency-injection autowired inject