2011-03-24 31 views
81

Estoy tratando de comprender el paquete javax.inject y no tengo claro para qué se debe usar la anotación javax.inject.Named. El Javadoc no explica la idea detrás de esto.¿Para qué se supone que se utiliza la anotación javax.inject.Named?

Javadoc está en http://download.oracle.com/javaee/6/api/javax/inject/Named.html

estoy usando Spring 3.0 escribir algunos programas de ejemplo, poniendo @Named en un grano de lo que parece a añadirlo a la fábrica de beans pero la descripción Javadoc es tan ligero que puede' d decir si ese es el comportamiento estándar o el comportamiento específico de Spring.

Mis preguntas son:

  1. ¿Cuál es la diferencia entre @Named y @Qualifier
  2. ¿Cómo se supone para indicar al sistema de tiempo de ejecución de una clase debe ser inyectable en otras clases cuál es la anotación para que? El equivalente de @Component en primavera?

Actualización 1 hay una excelente explicación de @Named y @Qualifier en Niza artículo sobre @Named y @Qualifierhttp://java.dzone.com/articles/java-ee6-cdi-named-components gracias @xmedeko para vincular a ella el comentario más abajo.

+0

La configuración de JSR-330 está fuera de la especificación, es decir, específica del contenedor. –

+1

De acuerdo con los documentos de Spring "la anotación @Named de JSR 330 se puede utilizar como un medio para detectar componentes y proporcionarles un nombre. Este comportamiento se activa automáticamente si tiene JAR de JSR 330 en el classpath". ¿Es este comportamiento único para la primavera o para todos los contenedores que entienden a @Named? – ams

Respuesta

54

Use @Named para diferenciar entre diferentes objetos del mismo tipo vinculados en el mismo ámbito.

@Named("maxWaitTime") 
public long maxWaitTimeMs; 

@Named("minWaitTime") 
public long minWaitTimeMs; 

Sin el calificador @Named, el inyector no sabría durante cuánto tiempo enlazar a qué variable.

Si desea crear anotaciones que actúen como @Named, use la anotación @Qualifier al crearlas. Si miras @Named, se anota con @Qualifier.

+0

Así que @Named es realmente @Qualifier, entonces ¿por qué @Qualifier requiere ser tan genérico, es la idea de permitir que alguien que use javax.inject defina estereotipos como @ Repository, @ Service, @ Controller que están marcados como @Qualifier? – ams

+0

No estoy seguro de lo que quieres decir con respecto a los estereotipos. Si se refiere a agregar nuevas anotaciones para distinguir entre diferentes instancias del mismo tipo, entonces sí. – sbridges

+0

Por ejemplo, en lugar de @Named ("maxWaitTime") podría tener @MaxWaitTime. Está un poco más limpio. – sourcedelica

7

En cuanto a # 2, de acuerdo con la especificación JSR-330:

Este paquete proporciona la dependencia anotaciones de inyección que permiten clases portátiles, pero deja configuración de la dependencia externa de hasta a la aplicación del inyector.

Depende del proveedor determinar qué objetos están disponibles para la inyección. En el caso de Spring, son todos los beans de Spring. Y cualquier clase anotada con anotaciones JSR-330 se agrega automáticamente como Spring beans cuando se utiliza un AnnotationConfigApplicationContext.

31

@Inject en lugar del @Autowired de Spring para inyectar un bean.
@Named en lugar de @Component de Spring para declarar un bean.
Esos JSR-330 anotaciones estándar se escanean y se recuperan de la misma forma que la anotación de la primavera (siempre y cuando el siguiente frasco está en la ruta de clase)

+0

La frase "inyectar un frijol" es ambigua; ¿Quiere decir "satisfacer todas las dependencias de ese frijol" o quiere decir "inyectar ese frijol en algo que lo tiene como una dependencia"? –

+0

¿Dónde puedo encontrar la lista de contrapartes de JSR para las anotaciones de primavera? – Pawan

+0

inyectar un frijol - "inyectar ese frijol en algo que lo tiene como una dependencia" –

2

La función principal de la anotación @Named es definir el grano con el propósito de resolver sentencias EL dentro de la aplicación, generalmente a través de los resolvedores JSF EL.La inyección podría realizarse mediante el uso de nombres, pero no era así como la inyección en CDI debía funcionar, ya que CDI nos brinda una forma mucho más rica de expresar los puntos de inyección y los granos que se inyectan en ellos.