2017-01-31 10 views
2

Теперь я читаю официальный документ Guice, но у меня есть некоторые вопросы, связанные с главой Binding Annotation.Guice: Связывание аннотаций с атрибутами

This объясняет «Аннотации с атрибутами». Но я не уверен в объяснении.

переплета Аннотации с атрибутами

Guice поддерживает привязку аннотаций, которые имеют значения атрибутов. В редком случае вам нужна такая аннотация:

Создать аннотацию @interface. Создайте класс, который реализует интерфейс аннотации . Следуйте рекомендациям для equals() и hashCode(), указанным в Annotation Javadoc. Передайте экземпляр в предложении привязки annotatedWith().

Я не понимаю, что объяснения. Для чего предназначено объяснение? Я узнал две аннотации, такие как @Paypal (в этом документе) и @name. Но, возможно, мы не можем достичь только этих двух аннотаций, когда я хочу использовать некоторые зависимости более двух в одном классе? Теперь я смущен, может кто-нибудь объяснить?

+0

Возможный дубликат https://stackoverflow.com/questions/5704918/custom-guice-binding- аннотации-с-параметрами. Ответ здесь лучше. – Phil

ответ

5

Guice выясняет, что вы хотите, чтобы ввести с помощью Key, которая просто имя для комбинации привязки аннотаций (аннотацию, которая сама по себе имеет аннотацию @BindingAnnotation или @Qualifier) и типа А (с параметры при необходимости). Это все действительные ключи, отличаются друг от друга:

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

Однако аннотации могут иметь атрибуты, как с @Named("your name here"). Это означает, что ключи отличаются не только тем, у кого есть обязательная аннотация, но и каковы ее атрибуты. Давайте добавим некоторые ключи с помощью аннотаций с атрибутами в приведенном выше списке:

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

Они все отличаются друг от друга, и все они являются действительными для предоставления Guice и инъекции из Guice.

В общем, вы, вероятно, не нужно создавать свои собственные обязательные аннотаций с атрибутами: переплета аннотаций не так распространены в первую очередь, и в большинстве случаев, когда вы хотите их могут быть обработаны с пустыми (нет- атрибут) привязки аннотаций или использование встроенной аннотации @Named (вместе с ее коллегой Names.named, которая помогает создать совместимый экземпляр вашей аннотации, который вы можете использовать в своем AbstractModule). Однако, если вы хотите создать свою собственную аннотацию привязки с атрибутами, вы можете использовать часть документов, которые вы указали для ее создания, особенно в соответствии с требованиями Annotation.equals и Annotation.hashCode. (Если это то, что вы ожидаете сделать много, подумайте об использовании библиотеки, например, Apache Commons AnnotationUtils или генератора кода, например Google Auto's AutoAnnotation.)

+0

Спасибо. Вы и документ объяснили «Ключ» - это просто имя для комбинации аннотации и типа. Например, '@Paypal CreditCardProcessor' имеет аннотацию' @ Paypal' и тип 'CreditCardProcessor'. В вашем объяснении, эти четыре строки «Ключи»? 'YourClassOne',' YourClassTwo', 'List ', 'List ' несмотря на отсутствие аннотации. –

+0

Да, тип без аннотации все еще может быть Ключом. Обратите внимание, что те, которые я перечислял, не являются строками, вы обычно просто видите тип и аннотацию в качестве поля или параметра конструктора, но если вы вручную создаете ключ, используя один из его заводских методов, вам нужно будет передать тип объект (обычно это класс или типLiteral). –