Потребность в инъекции @Qualifier - PullRequest
2 голосов
/ 09 сентября 2011

Нужна ли аннотация @Qualifier вообще?Разве мы не можем просто внедрить экземпляр определенного типа?Это кажется немного дополнительной работой, так как мы должны создать тип аннотации для каждого реализующего класса.Чтобы показать, что я имею в виду, вот пример ниже:

@Documented
@Retention(RUNTIME)
@Qualifier
public @interface AppleQ { }

@Documented
@Retention(RUNTIME)
@Qualifier
public @interface CheeseQ { }

public interface Eatable { }

@AppleQ
public class Apple implements Eatable { }

@CheeseQ
public class Cheese implements Eatable { }

public class Breakfast {
  @Inject @AppleQ Eatable somethingToEat;
}

против

public interface Eatable { }

public class Apple implements Eatable { }

public class Cheese implements Eatable { }

public class Breakfast {
  @Inject Apple somethingToEat;
}

Ответы [ 2 ]

7 голосов
/ 10 сентября 2011

Вы (вроде) правы, ваш пример работает без квалификаторов.Но скорее ваш пример немного вводит в заблуждение, чем то, что вам не нужны квалификаторы.

В общем, вам понадобятся квалификаторы всякий раз, когда у вас есть более одного управляемого бина определенного типа, подходящего дляинъекции .Это не так в вашем примере, но легко было бы, если бы вы написали свой код следующим образом:

public class Breakfast {
  @Inject Eatable somethingToEat;
}

(Это дает вам гибкость для изменения вашей реализации позже, по той же причине, по которой вы обычно пишетеList list = new ArrayList())

Вам не понадобятся квалификаторы, если у вас есть только один управляемый компонент определенного типа, пригодный для инъекции.

Более серьезные примеры, которые вы хотите использоватьквалификаторы выглядят так:

Представьте, что вы хотите иметь класс Locale в вашей системе.Использование разных квалификаторов (вместе с разными методами производителя) позволит вам написать код, подобный следующему:

...
@Inject
@DefaultLocale
Locale theDefaultLocale;
...
@Inject
@StandardLocale
Locale theStandardLocale;
...
@Inject 
Instance<Locale> allLocales;
...

Подводя итог: квалификаторы нужны тогда и только тогда, когда у вас есть более одного компонента одного типа.Это делает квалификаторы избыточными для подавляющего большинства ваших бобов, но они вам наверняка понадобятся.

Все это и многое другое лучше прочитать здесь .

1 голос
/ 10 сентября 2011

Нужна ли вообще аннотация @Qualifier?

Да, всегда.Фактически, @Default - это встроенный квалификатор, который информирует CDI о необходимости внедрения реализации компонента по умолчанию.Если вы определяете bean-компонент без квалификатора, bean-компонент автоматически имеет квалификатор @Default.Итак, в вашем примере код:

 public class Breakfast {
  @Inject Apple somethingToEat;
}

мог бы быть написан

public class Breakfast {
  @Inject @Default Apple somethingToEat;
}

Как вам уже ответили, , когда вам нужно более одного компонента, реализующеготого же типа bean-компонента, вы можете указать точку внедрения, чтобы точно указать, какой bean-компонент должен быть введен .

Квалификаторы также имеют другие преимущества.Например, в других средах (Seam и Spring) зависимости работают в основном путем именования bean-компонентов и привязки их к точкам внедрения по их именам, вместо этого CDI устраняет зависимость от имен на основе строк с помощью @Qualifiers.Используя квалификаторы, у вас есть инструменты затмения, специфичные для CDI, такие как Jboss Tools

...