À quoi sert l'annotation javax.inject.Named?

114

J'essaie de comprendre le javax.injectpackage et je ne sais pas à quoi javax.inject.Namedsert l' annotation. Le Javadoc n'explique pas l'idée derrière cela.

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

J'utilise Spring 3.0 pour écrire des exemples de programmes, en mettant @Namedun bean, il semble l'ajouter à l'usine de haricots, mais la description Javadoc est si légère que je ne peux pas dire si c'est le comportement standard ou le comportement spécifique de Spring.

Mes questions sont:

  1. Quelle est la différence entre @Namedet@Qualifier
  2. Comment êtes-vous censé dire au système Runtime qu'une classe doit être injectable dans d'autres classes quelle est l'annotation pour cela? L'équivalent du @Componentprintemps?

Mise à jour 1, il y a une excellente explication @Namedet @Qualifierà Nice article sur @Namedet @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components merci @xmedeko pour y avoir lié le commentaire ci-dessous.

ams
la source
La configuration du JSR-330 est en dehors des spécifications, c'est-à-dire spécifique au conteneur.
Thorbjørn Ravn Andersen
1
Selon la documentation de Spring, "l'annotation @Named de JSR 330 peut être utilisée comme un moyen à la fois de détecter des composants et de leur fournir un nom. Ce comportement est activé automatiquement si vous avez le JSR 330 JAR sur le chemin de classe." ce comportement est-il propre à Spring ou à tous les conteneurs qui comprennent @Named?
ams

Réponses:

87

Permet @Namedde différencier différents objets du même type liés dans la même étendue.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Sans le @Namedqualificatif, l'injecteur ne saurait pas quel temps se lier à quelle variable.

  • Si vous souhaitez créer des annotations qui agissent comme @Named, utilisez l' @Qualifierannotation lors de leur création.

  • Si vous regardez @Named, il est lui-même annoté avec @Qualifier.

ponts
la source
Donc, @Named est vraiment @Qualifier, alors pourquoi @Qualifier doit-il être si générique, est-ce l'idée de permettre à quelqu'un utilisant javax.inject de définir des stéréotypes tels que @ Repository, @ Service, @ Controller qui sont marqués comme @Qualifier?
ams
Je ne sais pas ce que vous entendez par les stéréotypes. Si vous voulez ajouter de nouvelles annotations pour distinguer différentes instances du même type, alors oui.
sbridges
Par exemple, au lieu de @Named ("maxWaitTime"), vous pourriez avoir @MaxWaitTime. C'est juste un peu plus propre.
sourcedelica
28
Bel article sur @Namedet @Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko
Je ne comprends pas ... ne pouvez-vous pas faire la différence entre eux par leurs différents noms de variables?
CodyBugstein
64

@Injectau lieu de Spring @Autowiredpour injecter un haricot.
@Namedau lieu de Spring @Componentpour déclarer un bean.

Ces annotations standard JSR-330 sont analysées et récupérées de la même manière que l'annotation Spring (tant que ce qui suit jarest dans votre chemin de classe)

Nadav Finish
la source
L'expression «injecter un bean» est ambiguë; voulez-vous dire "satisfaire toutes les dépendances de ce bean" ou voulez-vous dire "injecter ce bean dans quelque chose qui l'a comme dépendance"?
Andrew Swan
Où puis-je trouver la liste des homologues JSR des annotations de printemps?
Pawan
injecter un haricot - "injecter ce haricot dans quelque chose qui l'a comme dépendance"
Nadav Terminer
Je suis désolé Pawan, je ne connais pas une liste de JSR qui équivalent à l'annotation de printemps
Nadav Terminer
8

Concernant le n ° 2, selon la spécification JSR-330:

Ce package fournit des annotations d'injection de dépendances qui activent les classes portables, mais il laisse la configuration des dépendances externes à l'implémentation de l'injecteur.

C'est donc au fournisseur de déterminer quels objets sont disponibles pour l'injection. Dans le cas du printemps, ce sont tous les haricots de printemps. Et toute classe annotée avec des annotations JSR-330 est automatiquement ajoutée en tant que beans Spring lors de l'utilisation d'un AnnotationConfigApplicationContext.

sourcedelica
la source
5

Le rôle principal de l'annotation @Named est de définir un bean dans le but de résoudre les instructions EL au sein de l'application, généralement via des résolveurs JSF EL. L'injection peut être effectuée en utilisant des noms, mais ce n'était pas ainsi que l'injection dans CDI était censée fonctionner puisque CDI nous donne un moyen beaucoup plus riche d'exprimer les points d'injection et les beans à y injecter.

Abbas
la source