¿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 que alguien explicara su diferencia y cuál usar en qué situación.

Suponiendo que 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 elegido 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 de Spring (heredada). @Inject es parte de una nueva tecnología Java llamada CDI que define un estándar para dependency injection 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.

Aquí hay una publicación de blog que compara @Resource , @Inject y @Autowired , y 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énticos. Cuando miré debajo del capó determiné que la anotación ‘@Autowired’ y ‘@Inject’ se comportan de manera idéntica. Ambas anotaciones usan el ‘AutowiredAnnotationBeanPostProcessor’ para inyectar dependencias. ‘@Autowired’ y ‘@Inject’ se pueden usar de forma intercambiable para inyectar Spring beans. Sin embargo, la anotación ‘@Resource’ usa ‘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 hay un resumen de sus rutas de ejecución.

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

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

Para manejar la situación en la que no hay cableado, los beans están disponibles con @Autowired required attribute 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.

A partir de Spring 3.0, Spring ofrece soporte para anotaciones de dependency injections JSR-330 ( @Inject , @Named , @Singleton ).

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

La diferencia clave (notada al leer los Documentos de Spring ) entre @Autowired y @Inject es que @Autowired tiene el atributo ‘required’ (requerido) mientras que @Inject no tiene el atributo ‘required’ (requerido).

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

@Inject annotation es una anotación estándar, que se define en el estándar “Dependency Injection for Java” (JSR-330) . Spring (desde la versión 3.0) admite el modelo generalizado de dependency injection que se define en el estándar JSR-330. (Los marcos de Google Guice y el marco 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 usar para propiedades de enlace automático, métodos y constructores.

A diferencia de la anotación @Autowired , la anotación @Inject no tiene ningún atributo required . 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, se debe agregar el calificador @Named . En una situación similar para la anotación @Autowired se agregará el calificador @Qualifier (JSR-330 define su propia anotación @Qualifier y a través de esta anotación de calificador se define @Named ).

@Inject no tiene atributo ‘required’

Mejor uso @Inject todo el tiempo. Debido a que es un enfoque de configuración de Java (provisto por Sun) que hace que nuestra aplicación sea independiente del marco. Entonces, si tú también saltas, tus clases funcionarán.

Si usa @Autowired funcionará solo con la spring porque @Autowired es una anotación proporcionada por la spring.

Además de lo anterior:

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

La anotación @Inject es una de las colecciones de anotaciones JSR-330. Esto tiene las rutas de ejecución Match by Type, Match by Qualifier, Match by Name. Estas rutas de ejecución son válidas tanto para setter como para inyección de campo. El comportamiento de la anotación @Autowired es el mismo que el de la anotación @Inject . La única diferencia es que la anotación @Autowired es una parte del marco de Spring. @Autowired Anotación @Autowired también tiene las rutas de ejecución anteriores. Entonces recomiendo @Autowired para su respuesta.