Pregunta

¿Qué anotación, @Resource ( jsr250 ) o @Autowired (primavera-específico) se debe utilizar en DI?

he utilizado con éxito tanto en el pasado, y @Resource(name="blah") @Autowired @Qualifier("blah")

Mi instinto es seguir con la etiqueta @Resource ya que ha sido ratificado por el pueblo jsr.
Cualquier persona tiene pensamientos fuertes en esto?

¿Fue útil?

Solución

En la primavera de pre-3.0 no importa cuál.

En la primavera de 3,0 hay soporte para el estándar ( JSR-330 ) anotación @javax.inject.Inject - uso que, con una combinación de @Qualifier. Tenga en cuenta que la primavera ahora también es compatible con la @javax.inject.Qualifier meta-anotación:

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

Así se puede tener

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

o

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

Y a continuación:

@Inject @YourQualifier private Foo foo;

Esto hace menor uso de String-nombres, que pueden estar mal escritas y son más difíciles de mantener.


En cuanto a la pregunta original: ambos, sin especificar ningún atributo de la anotación, realice la inyección por tipo. La diferencia es:

  • @Resource le permite especificar un nombre del grano inyectada
  • @Autowired le permite marcar como no obligatorio.

Otros consejos

Tanto @Autowired (o @Inject) y el trabajo @Resource igualmente bien. Pero hay una diferencia conceptual o una diferencia en el significado

  • medios @Resource conseguirme un recurso conocido por su nombre . El nombre se extrae del nombre de la incubadora o campo anotado, o se toma del nombre-parámetro.
  • @Inject o @Autowired tratar de alambre en un adecuado otro componente por tipo .

Así que, básicamente, se trata de dos conceptos muy distintos. Por desgracia, la primavera-Implementación de @Resource tiene un built-in de reserva, que se activa cuando la resolución por nombre de falla. En este caso, se cae de nuevo a la resolución @Autowired especie por tipo. Si bien este repliegue es conveniente, en mi humilde opinión que causa mucha confusión, porque las personas no son conscientes de la diferencia conceptual y tienden a utilizar @Resource para autowiring basado en el tipo.

La principal diferencia es, @Autowired es una anotación de la primavera. Mientras que @Resource se especifica por la JSR-250, como usted ha señalado usted mismo. Por lo que el último es parte de Java, mientras que el primero es específica de primavera.

Por lo tanto, usted tiene razón en lo que sugiere que, en un sentido. He encontrado gente utiliza @Autowired con @Qualifier porque es más potente. El paso de algún marco de referencia a algún otro se considera muy poco probable, si no es mito, sobre todo en el caso de la primavera.

Me gustaría hacer hincapié en un comentario de @Jules en esta respuesta a esta pregunta. El comentario aporta un vínculo útil: primavera de inyección con @Resource , @Autowired y @Inject . Os animo a leerlo en su totalidad, sin embargo aquí es un breve resumen de su utilidad:

¿Cómo anotaciones seleccionar la aplicación correcta?

@Autowired y @Inject

  1. Partidos por tipo
  2. Restringe por Calificadores
  3. Partidos por Nombre

@Resource

  1. Partidos por Nombre
  2. Partidos por tipo
  3. Restringe por Calificadores (se ignora si se encuentra una coincidencia por su nombre)

¿Qué anotaciones (o combinación de) debo usar para inyectar mis frijoles?

  1. explícitamente el nombre de su componente [@Component ( "beanName")]

  2. Uso @Resource con el atributo name [@Resource (name = "beanName")]

¿Por qué no debo utilizar @Qualifier?

anotaciones Evitar @Qualifier a menos que desee crear una lista de los granos similares. Por ejemplo es posible que desee marcar un conjunto de reglas con una anotación específica @Qualifier. Este enfoque hace que sea fácil de inyectar un grupo de clases de reglas en una lista que puede ser utilizado para el procesamiento de datos.

inyección de frijol hace más lento mi programa?

paquetes específicos para los componentes de escaneo [context:component-scan base-package="com.sourceallies.person"]. Mientras que esto dará lugar a más configuraciones component-scan que reduce la probabilidad de que usted va a añadir componentes innecesarios a su contexto primavera.


Referencia: inyección del resorte con @Resource, @Autowired y @Inject

Esto es lo que obtuve de la Spring 3.0 Manual de Referencia .x : -

  

Consejo

     

Si usted tiene la intención de expresar la inyección de anotación impulsada por su nombre, hacer   No utilice principalmente @Autowired, incluso si es técnicamente capaz de   en referencia a un nombre de frijol a través de valores @Qualifier. En su lugar, utilice el   JSR-250 anotación @Resource, que se define semánticamente a   identificar un componente de destino específico por su nombre único, con el   tipo declarado ser irrelevante para el proceso de correspondencia.

     

Como una consecuencia específica de esta diferencia semántica, que son granos   ellos mismos definen como una colección o mapa tipo no se puede inyectar   a través @Autowired, porque el tipo de juego no es propiamente aplicable   a ellos. Utilice @Resource para este tipo de granos, en referencia a la específica   colección o mapa de frijol por su nombre único.

     

@Autowired aplica a los campos, constructores y multi-argumento   métodos, lo que permite reducir a través de anotaciones de clasificación en el   nivel de parámetros. Por el contrario, @Resource sólo se admite para los campos   y métodos setter propiedad de bean con un solo argumento. Como un   En consecuencia, seguir con calificadores si su objetivo es una inyección   constructor o un método multi-argumento.

@Autowired + @Qualifier sólo funcionará con DI primavera, si desea utilizar algún otro DI en el futuro @Resource es una buena opción.

Otra diferencia que me pareció muy significativo es @Qualifier no soporta el cableado frijol dinámico, como @Qualifier no soporta marcador de posición, mientras que @Resource lo hace muy bien.

Por ejemplo: si usted tiene una interfaz con múltiples implementaciones como esto

interface parent {

}
@Service("actualService")
class ActualService implements parent{

}
@Service("stubbedService")
class SubbedService implements parent{

}

con @Autowired y @Qualifier que necesita para configurar la aplicación específica del niño como

@Autowired
@Qualifier("actualService") or 
@Qualifier("stubbedService") 
Parent object;

que no proporciona marcador de posición mientras que con @Resource puede poner archivo de marcador de posición y de bienes de uso para inyectar aplicación específica niño como

@Resource(name="${service.name}")
Parent object;  

donde service.name se establece en el archivo propiedad como

#service.name=actualService
 service.name=stubbedService

Espero que ayude a alguien:)

Los dos son igual de buenos. La ventaja del uso de los recursos es en el futuro si desea otro marco DI distinta de la primavera, los cambios en el código será mucho más sencillo. Usando Autowired su código está estrechamente unida con muelles DI.

Cuando se analizan críticamente de las clases base de estos dos annotations.You se dará cuenta de las siguientes diferencias.

usos @Autowired AutowiredAnnotationBeanPostProcessor para inyectar dependencias.
usos @Resource CommonAnnotationBeanPostProcessor a las dependencias de la inyección.

A pesar de que utilizan diferentes clases de post-procesador que todos ellos se comportan casi idénticamente. Las diferencias se encuentran críticamente en sus rutas de ejecución, que he destacan a continuación.

@Autowired / @Inject

1.Matches por tipo
2.Restricts por Calificadores
3.Matches por nombre

@Resource

1.Matches por nombre
2.Matches por tipo
3.Restricts por Calificadores (ignorados si se encuentra una coincidencia por su nombre)

Con @Resource que puede hacer frijol autoinyección, podría ser necesario con el fin de ejecutar toda lógica extra añadido por los post-procesadores frijol como material transaccional o de seguridad relacionados.

Con la primavera 4.3+ @Autowired también es capaz de hacer esto.

@Resource se utiliza a menudo por los objetos de alto nivel, que se define a través de JNDI. @Autowired o @Inject serán utilizados por los granos más comunes.

Por lo que yo sé, no es una especificación, ni siquiera una convención. Es más el código estándar de manera lógica utilizará estas anotaciones.

Como nota aquí: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext y SpringBeanAutowiringSupport.processInjectionBasedOnServletContext no trabajo con anotación @Resource. Por lo tanto, hay diferencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top