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


Estoy revisando algunos blogs en SpringSource y en uno de los blogs, el autor está usando @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 si alguien explicara su diferencia y cuál usar en qué situación?


556
2017-08-22 02:30


origen


Respuestas:


Asumiendo que te refieres a la javax.inject.Inject anotaciones @Inject es parte del CDI de Java (Contextos e Inyección de Dependencia) estándar introducido en Java EE 6 (JSR-299), Lee mas. Spring ha elegido apoyar el uso @Inject sinónimo de su propio @Autowired anotación.

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


588
2017-08-22 07:08



Aquí hay un entrada en el blog eso compara @Resource, @Injecty @Autowiredy parece hacer un trabajo bastante completo.

Desde el enlace:

Con la excepción de las pruebas 2 y 7, la configuración y los resultados fueron   idéntico. Cuando miré debajo del capó determiné que   Las anotaciones '@Autowired' y '@Inject' se comportan de forma idéntica. Ambos   estas anotaciones usan el 'AutowiredAnnotationBeanPostProcessor' para   inyectar dependencias. '@Autowired' y '@Inject' pueden ser utilizados   intercambiables para inyectar Spring beans. Sin embargo, el '@Resource'   anotación utiliza el 'CommonAnnotationBeanPostProcessor' para inyectar   dependencias. A pesar de que usan diferentes clases de post procesador   todos se comportan de manera casi idéntica. A continuación se muestra un resumen de su   caminos de ejecución.

Las pruebas 2 y 7 a las que el autor hace referencia son "inyección por nombre de campo" y "intento de resolver un bean usando un calificador incorrecto", respectivamente.

La conclusión debería darle toda la información que necesita.


141
2017-08-22 05:28



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

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


26
2018-01-25 14:27



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

Hay un sección separada en la documentación de Spring sobre ellos, incluidas las comparaciones con sus equivalentes de primavera.


22
2017-07-17 09:17



La diferencia clave (notada al leer el Spring Docs) Entre @Autowired y @Inject es eso, @Autowired tiene el atributo 'requerido' mientras que @Inject no tiene el atributo 'required'.


17
2017-11-17 09:39



@Inject no tiene atributo 'requerido'


11
2017-08-19 09:44



@Autowired la anotación se define en el marco de Spring.

@Inject la anotación es una anotación estándar, que se define en la norma "Inyección de dependencias 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. (Marcos de Google Guice y Marco Picocontainer también es compatible con este modelo).

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

Anotaciones @Inject y @Autowired- es casi completa analogías. Tanto como @Autowired anotación, @Inject la anotación se puede usar para propiedades de enlace automático, métodos y constructores.

En contraste con @Autowired anotación, @Inject la anotación no tiene required atributo. Por lo tanto, si no se encuentran las dependencias, se lanzará una excepción.

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


11
2017-10-08 12:15