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

114

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

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

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

Мои вопросы:

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

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

военно-картографическая служба
источник
Конфигурация JSR-330 выходит за рамки спецификации, т.е. зависит от контейнера.
Thorbjørn Ravn Andersen
1
Согласно документам Spring, «аннотацию @Named в JSR 330 можно использовать как средство как для обнаружения компонентов, так и для предоставления им имени. Это поведение включается автоматически, если у вас есть JSR 330 JAR в пути к классам». это поведение уникально для Spring или для всех контейнеров, которые понимают @Named?
AMS

Ответы:

87

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

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

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

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

  • Если вы посмотрите @Named, он сам аннотирован @Qualifier.

sbridges
источник
Итак, @Named - это на самом деле @Qualifier, так почему же @Qualifier должен быть таким универсальным? Это идея позволить кому-то, использующему javax.inject, определять стереотипы, такие как @ Repository, @ Service, @ Controller, которые помечены как @Qualifier?
AMS
Я не совсем понимаю, что вы имеете в виду под стереотипами. Если вы имеете в виду добавление новых аннотаций для различения разных экземпляров одного и того же типа, тогда да.
sbridges
Например, вместо @Named ("maxWaitTime") вы можете использовать @MaxWaitTime. Это просто немного чище.
sourcedelica
28
Хорошая статья про @Namedи @Qualifier java.dzone.com/articles/java-ee6-cdi-
named-
Я не понимаю ... разве вы не можете отличить их по разным именам переменных?
CodyBugstein
64

@Injectвместо Spring, @Autowiredчтобы ввести bean.
@Namedвместо Spring @Componentдля объявления bean-компонента.

Эти стандартные аннотации JSR-330 сканируются и извлекаются так же, как аннотации Spring (если jarв вашем пути к классам есть следующее)

Надав Финиш
источник
Фраза «ввести фасоль» неоднозначна; Вы имеете в виду «удовлетворить все зависимости этого bean-компонента» или «внедрить этот bean-компонент во что-то, что имеет его как зависимость»?
Эндрю Свон,
Где я могу найти список JSR-аналогов аннотаций Spring?
Pawan
inject a bean - «внедрить этот bean во что-то, что имеет его зависимость»
Nadav Finish
Прошу прощения, Паван, я не знаком со списком JSR, который соответствует весенней аннотации
Надав Финиш
8

Что касается №2, согласно спецификации JSR-330:

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

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

sourcedelica
источник
5

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

аббас
источник