Для чого слід використовувати анотацію 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на квасоля, схоже, додайте його до фабрики бобів, але опис Javadoc настільки легкий, що я не можу сказати, чи це стандартна поведінка або специфічна для Spring поведінка.

Мої запитання:

  1. Яка різниця між @Namedі@Qualifier
  2. Як ви повинні сказати системі Runtime, що клас повинен бути ін'єкційним для інших класів, що є приміткою до цього? Еквівалент @Componentвесни?

Оновлення 1 є чудовим поясненням @Namedта @Qualifierв статті Ніцца про @Namedта @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components дякую @xmedeko за посилання на нього коментарем нижче.


Конфігурація JSR-330 знаходиться поза специфікацією, тобто специфічною для контейнера.
Thorbjørn Ravn Andersen

1
Згідно з весняними документами, "Анотація @SRPamed JSR 330 може бути використана як засіб як для виявлення компонентів, так і для надання їм імені. Ця поведінка вмикається автоматично, якщо у вас є JSR 330 JAR на класі." це поведінка унікальна для весни або для всіх контейнерів, які розуміють @Named?
ams

Відповіді:


87

Використовуйте @Namedдля розмежування різних об'єктів одного типу, пов'язаних в одній області.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Без @Namedкласифікатора інжектор не знав би, який довго прив’язати до якої змінної.

  • Якщо ви хочете створити анотації, які діють на зразок @Named, використовуйте @Qualifierпримітки під час їх створення.

  • Якщо ви подивитесь @Named, це саме анотовано @Qualifier.


Тож @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-components
xmedeko

Я не розумію ... хіба ти не можеш сказати різницю між ними за різними назвами змінних?
CodyBugstein

64

@Injectзамість Весняного @Autowiredввести боб.
@Namedзамість Spring's @Componentоголосити бобом.

Ці стандартні анотації JSR-330 скануються та отримуються так само, як і весняні анотації (доки наступне jarзнаходиться на вашому класі)


Словосполучення «ввести квасоля» неоднозначне; ти маєш на увазі "задовольнити всі залежності цього квасолі" чи ти маєш на увазі "ввести цей боб у щось, що має його як залежність"?
Ендрю Лебедь

Де можна знайти список аналогів СРСР до весняних анотацій?
Паван

введіть боб - "введіть боба в щось, що має його залежність"
Надав Закінчити

Вибачте, Pawan, я не знайомий зі списком JSR, який відповідає весняній анотації
Nadav Finish

8

Щодо №2, згідно специфікації JSR-330:

Цей пакет пропонує анотації щодо введення залежності, які дозволяють переносити класи, але він залишає конфігурацію зовнішньої залежності аж до реалізації інжектора.

Тому постачальник повинен визначити, які об'єкти доступні для ін'єкцій. Що стосується весни, то це все весняні боби. І будь-який клас, позначений анотаціями JSR-330, автоматично додається як весняні боби при використанні AnnotationConfigApplicationContext.


5

Основна роль анотації @Named полягає у визначенні квасолі для розв’язання операторів EL у програмі, як правило, через JSF EL-роздільники. Ін'єкцію можна проводити за допомогою назв, але це не так, як мав на увазі працювати ін'єкцію в CDI, оскільки CDI дає нам набагато багатший спосіб виразити точки введення та вводити боби в них.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.