¿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 @Resource
etiqueta, 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.Inject
con una combinación de@Qualifier
. Tenga en cuenta que spring ahora también admite la@javax.inject.Qualifier
metaanotació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:
@Resource
le permite especificar un nombre del frijol inyectado@Autowired
le permite marcarlo como no obligatorio.fuente
foo
o un constructorSomeBean
con unFoo
parámetro?@Resource
y@Autowired
, la respuesta real es la publicada por @Ichthyo, creo que esta debe actualizarse.Ambos
@Autowired
(o@Inject
) y@Resource
funcionan igual de bien. Pero hay una diferencia conceptual o una diferencia en el significado@Resource
significa conseguirme un recurso conocido por nombre . El nombre se extrae del nombre del configurador o campo anotado, o se toma del parámetro Nombre.@Inject
o@Autowired
intente conectar un otro componente adecuado por tipo .Entonces, básicamente estos son dos conceptos bastante distintos. Desafortunadamente, la implementación de Spring
@Resource
tiene un respaldo integrado, que se activa cuando falla la resolución por nombre. En este caso,@Autowired
recurre 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@Resource
para el cableado automático basado en tipos.fuente
@Resource
campo anotado y el nombre del campo coincide con la identificación de un bean en el contenedor, Spring arrojaráorg.springframework.beans.factory.BeanNotOfRequiredTypeException
si sus tipos difieren; esto se debe a que los beans se emparejan primero por nombre en@Resource
anotación, no por tipo. Pero si el nombre de la propiedad no coincide con el nombre del bean, Spring los conectará por tipo.@Autowire
no puede y no funcionará. Tendrás que usar@Resource
en ese caso.La principal diferencia es,
@Autowired
es una anotación de primavera. Mientras que@Resource
el 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
@Autowired
con@Qualifier
porque 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
@Autowired
con@Qualifier
realmente es más poderoso que la@Resource
anotació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?
@Autowired
y@Inject
@Resource
¿Qué anotaciones (o combinación de) debo usar para inyectar mis frijoles?
Nombre explícitamente su componente [@Component ("beanName")]
Usar
@Resource
con elname
atributo [@Resource (name = "beanName")]¿Por qué no debo usar
@Qualifier
?Evite las
@Qualifier
anotaciones a menos que desee crear una lista de beans similares. Por ejemplo, es posible que desee marcar un conjunto de reglas con una@Qualifier
anotació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-scan
configuraciones, 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.
@Autowired
utilizaAutowiredAnnotationBeanPostProcessor
para inyectar dependencias.@Resource
utilizaCommonAnnotationBeanPostProcessor
para 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
@Resource
usted 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+
@Autowired
también es capaz de hacer esto.fuente
@Resource
A menudo es utilizado por objetos de alto nivel, definidos a través de JNDI.@Autowired
o@Inject
será 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.processInjectionBasedOnCurrentContext
ySpringBeanAutowiringSupport.processInjectionBasedOnServletContext
NO funciona con@Resource
anotaciones. Entonces, hay diferencia.fuente