2017-01-31 1 views
2

Maintenant, je lis le document officiel de Guice, mais j'ai quelques questions liées au chapitre de l'annotation de liaison.Guice: Annoter des liens avec des attributs

This explique «Annotation avec attributs». Mais, je ne suis pas sûr de l'explication.

Annotations avec des attributs de liaison

Guice prend en charge les annotations de liaison qui ont des valeurs d'attribut. Dans le cas rare où vous avez besoin d'une telle annotation:

Créez l'annotation @interface. Créez une classe qui implémente l'interface d'annotation . Suivez les instructions pour equals() et hashCode() spécifié dans l'annotation Javadoc. Passez une instance de à la clause de liaison annotatedWith().

Je ne comprends pas cette explication. Pour quelle raison l'explication est-elle destinée? J'ai appris deux annotations telles que @Paypal (dans ce document) et @name. Mais peut-être que nous ne pouvons pas réaliser seulement avec ces deux annotations quand je veux employer quelques dépendances plus de deux vers une même classe? Maintenant, je suis confus, quelqu'un pourrait-il expliquer?

+0

duplication possible de https://stackoverflow.com/questions/5704918/custom-guice-binding- annotations-with-parameters La réponse ici est meilleure. – Phil

Répondre

5

Guice chiffres sur ce que vous voulez injecter à l'aide d'un Key, qui est juste un nom pour la combinaison de une annotation de liaison (une annotation qui est lui-même annotés avec @BindingAnnotation ou @Qualifier) et un type (avec paramètres si nécessaire). Ce sont toutes les clés valides, distinctes les unes des autres:

  • YourClassOne
  • YourClassTwo
  • List<Integer>
  • List<String>
  • @Paypal YourClassOne
  • @Paypal YourClassTwo
  • @YourBindingAnnotation YourClassOne
  • @YourBindingAnnotation List<String>

Cependant, les annotations sont autorisés à avoir des attributs, comme avec @Named("your name here"). Cela signifie que les clés diffèrent non seulement sur l'annotation de liaison que vous avez, mais sur ses attributs. Nous allons ajouter quelques clés à l'aide annotations avec des attributs à la liste ci-dessus:

  • @Named("foo") YourClassOne
  • @Named("bar") YourClassOne
  • @AnotherBindingAnnotation(foo=3, bar=5) YourClassOne
  • @AnotherBindingAnnotation(foo=6, bar=1) YourClassOne

Ils sont tous différents les uns des autres, et ils sont tous des choses valables à fournir à Guice et injecter de Guice.

En général, vous n'avez pas besoin probablement de créer vos propres annotations de liaison avec les attributs: annotations de liaison sont pas communes en premier lieu, et la plupart des cas où vous voulez qu'ils peuvent être manipulés avec vide (no- attribut) des annotations de liaison ou l'utilisation de l'annotation @Named intégrée (avec sa contrepartie, Names.named, qui vous aide à créer une instance compatible de votre annotation que vous pouvez utiliser dans votre AbstractModule). Toutefois, si vous voulez créer votre propre annotation de liaison avec des attributs, vous pouvez utiliser la partie des documents que vous avez cités pour la créer, notamment en vous conformant aux exigences Annotation.equals et Annotation.hashCode. (Si c'est quelque chose que vous vous attendez à faire beaucoup, pensez à utiliser une bibliothèque comme Apache Commons AnnotationUtils ou un générateur de code comme Google Auto's AutoAnnotation.)

+0

Merci. Vous et le document expliqué 'Key' est juste un nom pour la combinaison d'une annotation et d'un type. Par exemple, '@Paypal CreditCardProcessor' a l'annotation' @ Paypal' et le type 'CreditCardProcessor'. Dans votre explication, sont ces quatre cordes 'Key's? 'YourClassOne',' YourClassTwo', 'Liste ', 'Liste ' malgré aucune annotation. –

+0

Oui, un type sans annotation peut toujours être une clé. Notez que ceux que j'ai listés ne sont pas des chaînes - vous verrez généralement le type et l'annotation comme un champ ou un paramètre constructeur, mais si vous créez manuellement une clé en utilisant une de ses méthodes usine, vous devrez passer un type objet (généralement une classe ou un TypeLiteral). –