Do czego ma służyć adnotacja javax.inject.Named?

114

Próbuję zrozumieć javax.injectpakiet i nie wiem, co tojavax.inject.Named ma służyć adnotacja. Javadoc nie wyjaśnia stojącej za nim idei.

Javadoc jest dostępny pod adresem http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Używam Springa 3.0 do napisania kilku przykładowych programów, zakładając @Namedziarno, które wydaje się dodawać je do fabryki fasoli, ale opis Javadoc jest tak lekki, że nie mogę powiedzieć, czy jest to standardowe zachowanie, czy zachowanie specyficzne dla Springa.

Moje pytania to:

  1. Jaka jest różnica pomiędzy @Named i@Qualifier
  2. Jak masz powiedzieć systemowi Runtime, że klasa powinna być wstrzykiwana w innych klasach, jaka jest adnotacja do tego? Odpowiednik @Componentwiosny?

W aktualizacji 1 znajduje się doskonałe wyjaśnienie @Namedi @Qualifierw ładnym artykule na temat, @Nameda @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components dzięki @xmedeko za połączenie z nim poniższego komentarza.

ams
źródło
Konfiguracja JSR-330 jest poza specyfikacją, tj. Specyficzna dla kontenera.
Thorbjørn Ravn Andersen
1
Zgodnie z dokumentacją Springa „Adnotacja @Named JSR 330 może być używana jako środek zarówno do wykrywania komponentów, jak i do nadawania im nazw. To zachowanie jest włączane automatycznie, jeśli masz JSR 330 JAR na ścieżce klas”. czy to zachowanie jest unikalne dla wiosny lub dla wszystkich kontenerów, które obsługują @Named?
ranem

Odpowiedzi:

87

Służy @Nameddo rozróżniania różnych obiektów tego samego typu, powiązanych w tym samym zakresie.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Bez @Namedkwalifikatora iniektor nie wiedziałby, przez jaki czas związać się z którą zmienną.

  • Jeśli chcesz tworzyć adnotacje, które zachowują się jak @Named, użyj @Qualifieradnotacji podczas ich tworzenia.

  • Jeśli spojrzysz na @Namedto, sam jest oznaczony @Qualifier.

mosty
źródło
Tak więc @Named tak naprawdę to @Qualifier, więc dlaczego @Qualifier musi być tak ogólny, czy jest to pomysł, aby pozwolić komuś używającemu javax.inject na definiowanie stereotypów, takich jak @ Repository, @ Service, @ Controller, które są oznaczone jako @Qualifier?
ranem
Nie jestem pewien, co masz na myśli mówiąc o stereotypach. Jeśli masz na myśli dodanie nowych adnotacji, aby rozróżnić różne wystąpienia tego samego typu, to tak.
mosty
Na przykład zamiast @Named ("maxWaitTime") możesz mieć @MaxWaitTime. Jest trochę czystszy.
sourcedelica,
28
Fajny artykuł o @Namedi @Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko
Nie rozumiem ... czy nie możesz odróżnić ich po różnych nazwach zmiennych?
CodyBugstein
64

@Injectzamiast Springa @Autowiredwstrzyknąć fasolę.
@Namedzamiast wiosny @Componentogłosić fasolę.

Te standardowe adnotacje JSR-330 są skanowane i pobierane w taki sam sposób jak adnotacje wiosenne (o ile jarw ścieżce klas znajduje się poniższy kod)

Nadav Finish
źródło
Wyrażenie „wstrzyknij fasolę” jest niejednoznaczne; czy masz na myśli „spełnij wszystkie zależności tej fasoli”, czy też „wstrzyknij tę fasolę do czegoś, co ma ją jako zależność”?
Andrew Swan
Gdzie mogę znaleźć listę odpowiedników JSR do adnotacji wiosennych?
Pawan
wstrzyknij fasolę - „wstrzyknij tę fasolę do czegoś, co ma ją jako zależność”
Nadav Finish
Przepraszam Pawan, nie znam listy JSR, która odpowiada wiosennej adnotacji
Nadav Finish
8

Odnośnie nr 2, zgodnie ze specyfikacją JSR-330:

Ten pakiet zawiera adnotacje iniekcji zależności, które włączają klasy przenośne, ale pozostawia zewnętrzną konfigurację zależności do implementacji wtryskiwacza.

Zatem dostawca może określić, które obiekty są dostępne do wstrzyknięcia. W przypadku wiosny to cała wiosenna fasola. Każda klasa z adnotacjami JSR-330 jest automatycznie dodawana jako fasola Spring podczas używania AnnotationConfigApplicationContext.

sourcedelica
źródło
5

Podstawową rolą adnotacji @Named jest zdefiniowanie komponentu bean w celu rozwiązywania instrukcji EL w aplikacji, zwykle za pomocą resolwerów JSF EL. Iniekcję można wykonać przy użyciu nazw, ale nie tak miało działać iniekcja w CDI, ponieważ CDI daje nam znacznie bogatszy sposób wyrażania punktów wtrysku i ziaren, które mają być do nich wstrzyknięte.

abbas
źródło