Я пытаюсь понять пакет 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 для их ввода.