que mvc example ejemplo component anotaciones spring dependency-injection annotations cdi autowired

mvc - applicationcontext spring ejemplo



Anotaciones de Inyectar y Recurso y Autocableado (3)

¿Cuál es la diferencia entre @Inject y @Resource y @Autowired annotations?

¿Cuándo deberíamos usar cada uno de ellos?


Además de la respuesta de @Haim, hay una buena descripción de la diferencia entre las anotaciones Spring y JSR-330 (Dependency Injection for Java) y cómo usar la última con Spring.


La diferencia entre @Inject vs. @Autowire vs. @Resource?

@Autowired: anotación de propiedad de primavera (a diferencia de @Inject y @Resource) que inyecta un recurso por tipo, es decir, por la clase de por la interfaz del campo anotado o contratista. En caso de que tengamos poca implementación de una interfaz o una subclase, podemos reducir la selección utilizando la anotación @Qualifier para evitar ambigüedades. Para una coincidencia alternativa, el nombre del bean se considera un valor de calificador predeterminado. Aunque puede usar esta convención para referirse a beans específicos por nombre, @Autowired es fundamentalmente acerca de la inyección impulsada por tipo con calificadores semánticos opcionales.

@Inject: la anotación basada en JSR-330 (Dependency Injection for Java) identifica constructores, métodos y campos inyectables. Esta anotación es un reemplazo directo casi completo para la anotación @Autowired de Spring. Por lo tanto, en lugar de utilizar la anotación @Autowired específica de Spring, puede optar por utilizar @Inject. Una de las diferencias entre @Autowired y @Inject es que @Inject no tiene el campo requerido, por lo que, en caso de que no logremos encontrar un objeto adecuado para inyectar, fallará mientras @Autowired pueda usarse required = false y permita el campo null able (only ¡si es requerido!). La ventaja de la anotación @Inject es que en lugar de inyectar una referencia directamente, puede pedirle a @Inject que inyecte un Proveedor. La interfaz del proveedor permite, entre otras cosas, la inyección diferida de referencias de beans y la inyección de instancias múltiples de un bean. En caso de que tengamos poca implementación de una interfaz o una subclase, podemos reducir la selección utilizando la anotación @Named para evitar ambigüedades. La anotación @Named funciona de manera muy parecida al @Qualifier de Spring

@Resource: anotación basada en JSR-250. @Resource es bastante similar a @Autowired y @Inject, pero la principal diferencia son las rutas de ejecución que se llevan a cabo para encontrar el bean requerido para inyectar. @Resource limitará la búsqueda primero por nombre, luego por tipo y, finalmente, por Calificadores (se ignora si la coincidencia se encuentra por nombre). @Autowired y @Inject limitarán la búsqueda primero por tipo, luego por calificador y finalmente por el nombre.


|------------|---------------|---------------|---------------|-----------------------| | | Setter/Field | Constructor | Applicable to | Matching order | | | injection | injection | type | | |------------|---------------|---------------|---------------|-----------------------| | @Autowired | X | X | | Type, Qualifier, Name | |------------|---------------|---------------|---------------|-----------------------| | @Inject | X | X | | Type, Qualifier, Name | |------------|---------------|---------------|---------------|-----------------------| | @Resource | X | | X | Name, Type, Qualifier | |------------|---------------|---------------|---------------|-----------------------|

Entonces en la inyección de dependencia Spring @Inject y @Autowired tienen exactamente el mismo comportamiento.