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

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

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

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

Мои вопросы:

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

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


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


Ответы (4)


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

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

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

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

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

person sbridges    schedule 24.03.2011
comment
Итак, @Named на самом деле является @Qualifier, так почему @Qualifier должен быть таким универсальным? Это идея позволить кому-либо, использующему javax.inject, определять стереотипы, такие как @ Repository, @ Service, @ Controller, которые помечены как @Qualifier? - person ams; 24.03.2011
comment
Я не понимаю, что вы имеете в виду под стереотипами. Если вы имеете в виду добавление новых аннотаций для различения разных экземпляров одного и того же типа, тогда да. - person sbridges; 24.03.2011
comment
Например, вместо @Named (maxWaitTime) вы можете использовать @MaxWaitTime. Это просто немного чище. - person sourcedelica; 24.03.2011
comment
Хорошая статья о @Named и @Qualifier java.dzone.com/articles/java- ee6-cdi-named-components - person xmedeko; 19.09.2012
comment
Я не понимаю ... разве вы не можете отличить их по разным именам переменных? - person CodyBugstein; 11.05.2014
comment
Разве тот факт, что переменная названа maxWaitTimeMs, не говорит инжектору, какой long привязать к какой переменной? Зачем нам нужны и @Named, и имя переменной? - person CodyBugstein; 16.06.2014
comment
нет, вы не можете использовать для этого имена переменных. имена переменных не всегда доступны во время выполнения. java 8 делает это немного лучше, openjdk.java.net/jeps/118 - person sbridges; 17.06.2014
comment
Имена полей всегда доступны во время выполнения в любой версии Java. Причина, по которой аннотации типа @Named и @Qualifier полезны, заключается в том, что у вас могут быть разные точки внедрения (обычно поля) одного типа и name, но в разных областях (т. Е. Разных классы собственников); в таком случае имя, указанное в квалификаторе, используется контейнером DI для выбора между несколькими вводимыми bean-компонентами / значениями одного и того же типа. - person Rogério; 09.10.2015
comment
@sbridges Привет, я просто хочу знать наверняка, что если существует только одна реализация определенного интерфейса, @named все еще требуется для этой реализации? Могу ли я просто использовать @Inject (без использования @named) для внедрения реализации в переменную соответствующего интерфейса? Я знаю, что для Spring вам нужно пометить класс как компонент для создания bean-компонента. Здесь действует то же правило? Спасибо! - person Dreamer; 31.07.2018

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

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

person Nadav Finish    schedule 08.09.2014
comment
Фраза inject a bean неоднозначна; Вы имеете в виду удовлетворить все зависимости этого компонента или внедрить этот компонент во что-то, что имеет его как зависимость? - person Andrew Swan; 27.04.2016
comment
Где я могу найти список JSR-аналогов аннотаций Spring? - person Pawan; 04.05.2017
comment
inject a bean - внедрить этот bean во что-то, у чего он есть зависимость - person Nadav Finish; 08.05.2017
comment
Мне жаль, Паван, я не знаком со списком JSR, который соответствует аннотации Spring - person Nadav Finish; 08.05.2017

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

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

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

person sourcedelica    schedule 24.03.2011

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

person abbas    schedule 13.12.2016