Для чего нужна аннотация javax.inject.Named? - PullRequest
100 голосов
/ 24 марта 2011

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

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

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

Мои вопросы:

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

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

Ответы [ 4 ]

71 голосов
/ 24 марта 2011

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

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

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

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

48 голосов
/ 08 сентября 2014

@Inject вместо Spring's @Autowired для введения компонента.
@Named вместо @Component Spring для объявления бина.

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

7 голосов
/ 24 марта 2011

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

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

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

3 голосов
/ 13 декабря 2016

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

...