¿Para qué se usa la anotación javax.inject.Named?
spring dependency-injection (4)
Estoy tratando de entender el paquete javax.inject
y no estoy javax.inject.Named
qué se supone que se usará la anotación javax.inject.Named
. El Javadoc no explica la idea detrás de esto.
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 @Named
en un bean parece agregarlo a la fábrica de beans pero la descripción de Javadoc es tan liviana que no puedo decir si ese es el comportamiento estándar o el comportamiento específico de Spring.
Mis preguntas son:
- Cuál es la diferencia entre
@Named
y@Qualifier
- ¿Cómo se supone que debes decirle al sistema Runtime que una clase debe ser inyectable en otras clases? ¿Cuál es la anotación para eso? ¿El equivalente de
@Component
en Spring?
Actualización 1 hay una excelente explicación de @Named
y @Qualifier
en el artículo de Nice sobre @Named
y @Qualifier
http://java.dzone.com/articles/java-ee6-cdi-named-components gracias @xmedeko por vincularlo el comentario a continuación.
@Inject en lugar de @Autowired de Spring para inyectar un bean.
@Named en lugar del @Component de Spring para declarar un bean.
Esas anotaciones estándar de JSR-330 se escanean y se recuperan de la misma manera que la anotación de Spring (siempre que el siguiente jar esté en su classpath)
La función principal de la anotación @Named es definir un bean con el fin de resolver las declaraciones EL dentro de la aplicación, generalmente a través de los resolvedores JSF EL. La inyección se puede realizar usando nombres, pero no fue así como se pretendía que la inyección en CDI funcionara, 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.
Respecto al n. ° 2, según la especificación JSR-330:
Este paquete proporciona anotaciones de inyección de dependencia que permiten clases portátiles, pero deja la configuración de dependencia externa en la implementació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.
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 vincularse 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.