Для чего предназначена javax.inject.Named аннотация?

Я пытаюсь понять пакет javax.inject, и я не понимаю, для чего должна использоваться аннотация javax.inject.Named. Джавадок не объясняет идею, стоящую за ней.

Javadoc находится в http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Я использую Spring 3.0 для написания некоторых примеров программ, помещая @Named в bean, кажется, добавляет его в bean factory, но описание Javadoc настолько я не могу сказать, является ли это стандартным поведением или Spring конкретным поведением.

Мои вопросы:

  • В чем разница между @Named и @Qualifier
  • Как вы должны сообщать системе Runtime, что класс должен быть внедрен в другие классы, что для этой аннотации? Эквивалент @Component в Spring?

Обновление 1 есть отличное объяснение @Named и @Qualifier в статье Nice о @Named и @Qualifier http://java.dzone.com/articles/java-ee6-cdi-named-components благодарит @xmedeko за ссылку на комментарий ниже.

Ответ 1

Используйте @Named, чтобы различать разные объекты одного и того же типа в той же области.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Без классификатора @Named инжектор не будет знать, что долго связывать с какой переменной.

Если вы хотите создавать аннотации, которые действуют как @Named, используйте аннотацию @Qualifier при их создании. Если вы посмотрите на @Named, он сам будет аннотирован с помощью @Qualifier.

Ответ 2

@Inject вместо Spring s @Autowired для ввода bean.
@Named вместо Spring s @Component для объявления bean.
Эти стандартные аннотации JSR-330 сканируются и извлекаются так же, как аннотация Spring (пока следующая банка находится в вашем пути к классам)

Ответ 3

Относительно # 2, в соответствии со спецификацией JSR-330:

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

Таким образом, провайдер должен определить, какие объекты доступны для инъекций. В случае Spring это все Spring beans. И любой класс, аннотированный аннотациями JSR-330, автоматически добавляется как Spring beans при использовании объекта AnnotationConfigApplicationContext.

Ответ 4

Основная роль аннотации @Named заключается в определении bean с целью разрешения выражений EL в приложении, обычно с помощью разрешителей JSF EL. Инъекция может быть выполнена с использованием имен, но это было не так, как инъекция в CDI должна была работать, поскольку CDI дает нам гораздо более богатый способ выразить инъекционные точки и beans для их ввода.