¿Para qué se supone que se usa la anotación javax.inject.Named?

114

Estoy tratando de entender el javax.injectpaquete y no tengo claro para qué javax.inject.Namedse supone que se usa la anotación. El Javadoc no explica la idea que hay detrás.

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

Estoy usando Spring 3.0 para escribir algunos programas de muestra, al poner @Namedun bean parece agregarlo a la fábrica de frijoles, pero la descripción de Javadoc es tan ligera que no puedo 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 @Namedy@Qualifier
  2. ¿Cómo se supone que le diga al sistema Runtime que una clase debe ser inyectable en otras clases cuál es la anotación para eso? ¿El equivalente de @Componenten primavera?

En la Actualización 1 hay una excelente explicación @Namedy @Qualifieren el artículo de Niza sobre @Namedy @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components gracias @xmedeko por vincularlo al comentario a continuación.

ams
fuente
La configuración de JSR-330 está fuera de la especificación, es decir, específica del contenedor.
Thorbjørn Ravn Andersen
1
Según los documentos de Spring, "la anotación @Named de JSR 330 se puede usar como un medio para detectar componentes y proporcionarles un nombre. Este comportamiento se habilita automáticamente si tiene el JSR 330 JAR en la ruta de clase". ¿Es este comportamiento exclusivo de Spring o de todos los contenedores que entienden @Named?
ams

Respuestas:

87

Úselo @Namedpara diferenciar entre diferentes objetos del mismo tipo enlazados en el mismo ámbito.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Sin el @Namedcalificador, el inyector no sabría qué largo enlazar a qué variable.

  • Si desea crear anotaciones que actúen como @Named, utilice la @Qualifieranotación al crearlas .

  • Si miras @Named, está anotado con@Qualifier .

puentes
fuente
Entonces @Named realmente es @Qualifier, entonces, ¿por qué se requiere que @Qualifier sea tan genérico? ¿La idea es permitir que alguien que use javax.inject defina estereotipos como @ Repository, @ Service, @ Controller que están marcados como @Qualifier?
ams
No sé a qué te refieres con los estereotipos. Si se refiere a agregar nuevas anotaciones para distinguir entre diferentes instancias del mismo tipo, entonces sí.
puentes
Por ejemplo, en lugar de @Named ("maxWaitTime") podrías tener @MaxWaitTime. Es solo un poco más limpio.
sourcedelica
28
Buen artículo sobre @Namedy @Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko
No entiendo ... ¿no puedes distinguir entre ellos por sus diferentes nombres de variable?
CodyBugstein
64

@Injecten lugar de Spring @Autowiredpara inyectar un bean.
@Nameden lugar de Spring @Componentpara declarar un bean.

Esas anotaciones estándar JSR-330 se escanean y recuperan de la misma manera que la anotación Spring (siempre que lo siguiente jaresté en su ruta de clase)

Acabado Nadav
fuente
La frase "inyectar un frijol" es ambigua; ¿Quiere decir "satisfacer todas las dependencias de ese bean" o quiere decir "inyectar ese bean en algo que lo tiene como dependencia"?
Andrew Swan
¿Dónde puedo encontrar una lista de contrapartes JSR para las anotaciones de primavera?
Pawan
inyectar un frijol - "inyectar ese frijol en algo que lo tenga como dependencia"
Nadav Finish
Lo siento Pawan, no estoy familiarizado con una lista de JSR que sea equivalente a la anotación de primavera
Nadav Finish
8

Con respecto al # 2, de acuerdo con la especificación JSR-330:

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

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

fuentedelica
fuente
5

La función principal de la anotación @Named es definir un bean con el propósito de resolver declaraciones EL dentro de la aplicación, generalmente a través de resolutores JSF EL. La inyección se puede realizar usando nombres, pero no era así como se suponía que funcionara la inyección en CDI, ya que CDI nos brinda una forma mucho más rica de expresar los puntos de inyección y los granos que se inyectarán en ellos.

abbas
fuente