¿Qué anotación, @Resource ( jsr250 ) o @Autowired (Spring-specific) debo usar en DI?
He usado con éxito tanto en el pasado @Resource(name="blah")como@Autowired @Qualifier("blah")
Mi instinto es seguir con la @Resourceetiqueta, ya que ha sido ratificada por la gente jsr.
¿Alguien tiene pensamientos fuertes sobre esto?

Respuestas:
En primavera pre-3.0 no importa cuál.
En la primavera 3.0 hay soporte para la anotación estándar ( JSR-330 ): úsela
@javax.inject.Injectcon una combinación de@Qualifier. Tenga en cuenta que spring ahora también admite la@javax.inject.Qualifiermetaanotación:Para que puedas tener
o
Y entonces:
Esto hace menos uso de los nombres de cadena, que pueden estar mal escritos y son más difíciles de mantener.
En cuanto a la pregunta original: ambos, sin especificar ningún atributo de la anotación, realizan la inyección por tipo. La diferencia es:
@Resourcele permite especificar un nombre del frijol inyectado@Autowiredle permite marcarlo como no obligatorio.fuente
fooo un constructorSomeBeancon unFooparámetro?@Resourcey@Autowired, la respuesta real es la publicada por @Ichthyo, creo que esta debe actualizarse.Ambos
@Autowired(o@Inject) y@Resourcefuncionan igual de bien. Pero hay una diferencia conceptual o una diferencia en el significado@Resourcesignifica conseguirme un recurso conocido por nombre . El nombre se extrae del nombre del configurador o campo anotado, o se toma del parámetro Nombre.@Injecto@Autowiredintente conectar un otro componente adecuado por tipo .Entonces, básicamente estos son dos conceptos bastante distintos. Desafortunadamente, la implementación de Spring
@Resourcetiene un respaldo integrado, que se activa cuando falla la resolución por nombre. En este caso,@Autowiredrecurre a la resolución de tipo por tipo. Si bien este retroceso es conveniente, en mi humilde opinión, causa mucha confusión, porque las personas desconocen la diferencia conceptual y tienden a usar@Resourcepara el cableado automático basado en tipos.fuente
@Resourcecampo anotado y el nombre del campo coincide con la identificación de un bean en el contenedor, Spring arrojaráorg.springframework.beans.factory.BeanNotOfRequiredTypeExceptionsi sus tipos difieren; esto se debe a que los beans se emparejan primero por nombre en@Resourceanotación, no por tipo. Pero si el nombre de la propiedad no coincide con el nombre del bean, Spring los conectará por tipo.@Autowireno puede y no funcionará. Tendrás que usar@Resourceen ese caso.La principal diferencia es,
@Autowiredes una anotación de primavera. Mientras que@Resourceel JSR-250 lo especifica, como usted mismo señaló. Entonces, el último es parte de Java, mientras que el primero es específico de Spring.Por lo tanto, tiene razón al sugerir eso, en cierto sentido. He encontrado gente utiliza
@Autowiredcon@Qualifierporque es más potente. Pasar de un marco a otro se considera muy poco probable, si no un mito, especialmente en el caso de Spring.fuente
@Autowiredcon@Qualifierrealmente es más poderoso que la@Resourceanotación estándar JSR (piense en dependencias opcionales, por ejemplo, con@Autowired(required=false). No puede hacer eso con@Resource)Me gustaría enfatizar un comentario de @Jules sobre esta respuesta a esta pregunta. El comentario trae un enlace útil: Spring Injection con @Resource, @Autowired y @Inject . Te animo a que lo leas por completo, sin embargo, aquí hay un resumen rápido de su utilidad:
¿Cómo las anotaciones seleccionan la implementación correcta?
@Autowiredy@Inject@Resource¿Qué anotaciones (o combinación de) debo usar para inyectar mis frijoles?
Nombre explícitamente su componente [@Component ("beanName")]
Usar
@Resourcecon elnameatributo [@Resource (name = "beanName")]¿Por qué no debo usar
@Qualifier?Evite las
@Qualifieranotaciones a menos que desee crear una lista de beans similares. Por ejemplo, es posible que desee marcar un conjunto de reglas con una@Qualifieranotación específica . Este enfoque simplifica la inyección de un grupo de clases de reglas en una lista que se puede usar para procesar datos.¿La inyección de frijoles ralentiza mi programa?
Escanee paquetes específicos para componentes
[context:component-scan base-package="com.sourceallies.person"]. Si bien esto dará como resultado máscomponent-scanconfiguraciones, reduce la posibilidad de que agregue componentes innecesarios a su contexto Spring.Referencia: inyección de primavera con @Resource, @Autowired y @Inject
fuente
Esto es lo que obtuve del Manual de referencia de Spring 3.0.x : -
fuente
@Autowired + @Qualifier funcionará solo con Spring DI, si desea utilizar alguna otra DI en el futuro @Resource es una buena opción.
Otra diferencia que encontré muy significativa es que @Qualifier no admite el cableado de bean dinámico, ya que @Qualifier no admite el marcador de posición, mientras que @Resource lo hace muy bien.
Por ejemplo: si tiene una interfaz con múltiples implementaciones como esta
con @Autowired y @Qualifier necesita establecer una implementación secundaria específica como
que no proporciona marcador de posición, mientras que con @Resource puede colocar marcador de posición y usar el archivo de propiedades para inyectar una implementación secundaria específica como
donde service.name se establece en el archivo de propiedades como
Espero que ayude a alguien :)
fuente
Ambos son igualmente buenos. La ventaja de usar Resource es en el futuro si desea otro marco de DI que no sea Spring, sus cambios de código serán mucho más simples. Usando Autowired su código está estrechamente acoplado con resortes DI.
fuente
Cuando analice críticamente desde las clases base de estas dos anotaciones, se dará cuenta de las siguientes diferencias.
@AutowiredutilizaAutowiredAnnotationBeanPostProcessorpara inyectar dependencias.@ResourceutilizaCommonAnnotationBeanPostProcessorpara inyectar dependencias.Aunque utilizan diferentes clases de postprocesador, todos se comportan de manera casi idéntica. Las diferencias se encuentran críticamente en sus rutas de ejecución, que he destacado a continuación.
1. Emparejamientos por tipo
2. Restricciones por calificadores
3. Emparejamientos por nombre
1. coincidencias por nombre
2. coincidencias por tipo
3. Restricciones por calificadores (se ignora si la coincidencia se encuentra por nombre)
fuente
Con
@Resourceusted puede realizar la autoinyección de bean, puede ser necesario para ejecutar toda la lógica adicional agregada por los postprocesadores de bean como cosas transaccionales o relacionadas con la seguridad.Con Spring 4.3+
@Autowiredtambién es capaz de hacer esto.fuente
@ResourceA menudo es utilizado por objetos de alto nivel, definidos a través de JNDI.@Autowiredo@Injectserá utilizado por frijoles más comunes.Que yo sepa, no es una especificación, ni siquiera una convención. Es más la forma lógica en que el código estándar usará estas anotaciones.
fuente
Como una nota aquí:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContextySpringBeanAutowiringSupport.processInjectionBasedOnServletContextNO funciona con@Resourceanotaciones. Entonces, hay diferencia.fuente