¿Cuál es la diferencia entre @Inject y @Autowired en Spring Framework? ¿Cuál usar bajo qué condiciones?
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á el fragmento de código:
@Inject private CustomerOrderService customerOrderService;
Entonces, ¿cuál es la diferencia entre usar @Inject
y @Autowired
? Agradecería que alguien explicara su diferencia y cuál usar en cada situación.
Suponiendo que aquí te refieres a la javax.inject.Inject
anotación. @Inject
es parte del estándar Java CDI ( Inyección de contextos y dependencias ) introducido en Java EE 6 (JSR-299), lea más . Spring ha optado por admitir el uso de la @Inject
anotación como sinónimo de su propia @Autowired
anotación.
Entonces, para responder a su pregunta, @Autowired
está la propia anotación de Spring. @Inject
es parte de una tecnología Java llamada CDI que define un estándar para la inyección de dependencia similar a Spring. En una aplicación Spring, las dos anotaciones funcionan de la misma manera, ya que Spring decidió admitir algunas anotaciones JSR-299 además de las suyas.
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 las anotaciones '@Autowired' y '@Inject' se comportan de manera idéntica. Ambas anotaciones utilizan 'AutowiredAnnotationBeanPostProcessor' para inyectar dependencias. '@Autowired' y '@Inject' se pueden usar de forma intercambiable para inyectar Spring beans. Sin embargo, la anotación '@Resource' utiliza el 'CommonAnnotationBeanPostProcessor' para inyectar dependencias. Aunque utilizan diferentes clases de postprocesadores, todos se comportan de forma casi idéntica. A continuación se muestra un resumen de sus rutas de ejecución.
Las pruebas 2 y 7 a las que hace referencia el autor son 'inyección por nombre de campo' y 'un intento de resolver un bean usando un calificador incorrecto', respectivamente.
La Conclusión debería brindarle toda la información que necesita.
Para manejar la situación en la que no hay cableado, hay beans disponibles con el @Autowired
required
atributo establecido en false
.
Pero cuando se usa @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 (que se nota al leer Spring Docs ) entre @Autowired
y @Inject
es que @Autowired
tiene el atributo 'requerido' mientras que @Inject no tiene ningún atributo 'requerido'.
A partir de Spring 3.0, Spring ofrece soporte para 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.