142 votes

A quoi est censée servir l'annotation javax.inject.Named ?

J'essaie de comprendre le javax.inject et je ne sais pas exactement ce que le javax.inject.Named L'annotation est censée être utilisée pour. La Javadoc n'explique pas l'idée derrière cette annotation.

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

J'utilise Printemps 3.0 pour écrire quelques exemples de programmes, en mettant @Named sur un bean semble l'ajouter à la fabrique du bean mais la description de la Javadoc est si légère que je ne peux pas dire si c'est le comportement standard ou un comportement spécifique à Spring.

Mes questions sont les suivantes :

  1. Quelle est la différence entre @Named y @Qualifier
  2. Comment indiquer au système d'exécution qu'une classe doit pouvoir être injectée dans d'autres classes, quelle est l'annotation pour cela ? L'équivalent de @Component au printemps ?

Mise à jour 1 il y a une excellente explication de @Named y @Qualifier à Nice article sur @Named y @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components merci @xmedeko pour le lien dans le commentaire ci-dessous.

0 votes

La configuration de la JSR-330 est en dehors de la spécification, c'est-à-dire spécifique au conteneur.

1 votes

Selon la documentation de Spring, "l'annotation @Named de la JSR 330 peut être utilisée comme un moyen de détecter les composants et de leur donner un nom. Ce comportement est activé automatiquement si vous avez le JAR JSR 330 dans le classpath". Ce comportement est-il propre à Spring ou à tous les conteneurs qui comprennent @Named ?

104voto

sbridges Points 16284

Utilisez @Named a différencier entre différents objets du même type liés dans la même portée.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Sans le @Named l'injecteur ne saurait pas quelle longueur lier à quelle variable.

  • Si vous voulez créer des annotations qui agissent comme des @Named utilisez le @Qualifier lors de leur création.

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

0 votes

L'idée est de permettre à quelqu'un qui utilise javax.inject de définir des stéréotypes comme @Repository,@Service,@Controller qui sont marqués comme @Qualifier ?

0 votes

Je ne suis pas sûr de ce que vous voulez dire à propos des stéréotypes. Si vous voulez dire ajouter de nouvelles annotations pour distinguer les différentes instances d'un même type, alors oui.

0 votes

Par exemple, au lieu de @Named("maxWaitTime"), vous pourriez avoir @MaxWaitTime. C'est juste un peu plus propre.

76voto

Nadav Finish Points 76

@Inject au lieu de la méthode de Spring @Autowired pour injecter un haricot.
@Named au lieu de la méthode de Spring @Component pour déclarer un haricot.

Ces JSR-330 Les annotations standard sont scannées et récupérées de la même manière que les annotations Spring (à condition que les éléments suivants jar se trouve dans votre classpath)

0 votes

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" ?

0 votes

Où puis-je trouver la liste des équivalents JSR des annotations de printemps ?

0 votes

Injecter un bean - "injecter ce bean dans quelque chose qui en est dépendant".

8voto

sourcedelica Points 12533

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

Ce paquet fournit la dépendance qui permettent à des 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 de Spring, il s'agit de tous les Spring beans. Et toutes les classes annotées avec les annotations JSR-330 sont automatiquement ajoutées comme des beans Spring lors de l'utilisation d'un AnnotationConfigApplicationContext.

5voto

abbas Points 483

Le rôle principal de l'annotation @Named est de définir un bean dans le but de résoudre les déclarations EL au sein de l'application, généralement par le biais de résolveurs EL JSF. L'injection peut être effectuée à l'aide de noms, mais ce n'est pas ainsi que l'injection dans CDI était censée fonctionner, puisque CDI nous offre une manière beaucoup plus riche d'exprimer les points d'injection et les beans à injecter dans ces points.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X