Wofür soll die Annotation javax.inject.Named verwendet werden?

113

Ich versuche, das javax.injectPaket zu verstehen , und mir ist nicht klar, wofür die javax.inject.NamedAnmerkung verwendet werden soll. Der Javadoc erklärt die Idee dahinter nicht.

Javadoc finden Sie unter http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Ich verwende Spring 3.0 , um einige Beispielprogramme zu schreiben. @NamedWenn ich eine Bean anlege, scheint sie der Bean-Factory hinzugefügt zu werden, aber die Javadoc-Beschreibung ist so leicht, dass ich nicht sagen kann, ob dies das Standardverhalten oder das Spring-spezifische Verhalten ist.

Meine Fragen sind:

  1. Was ist der Unterschied zwischen @Namedund@Qualifier
  2. Wie sollen Sie dem Runtime-System mitteilen, dass eine Klasse in andere Klassen injizierbar sein soll? Wie lautet die Anmerkung dazu? Das Äquivalent von @Componentim Frühling?

Update 1 gibt es eine ausgezeichnete Erklärung von @Namedund @Qualifierin Nizza Artikel über @Namedund @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components danke @xmedeko für die Verknüpfung mit dem Kommentar unten.

ams
quelle
Die Konfiguration von JSR-330 liegt außerhalb der Spezifikation, dh container-spezifisch.
Thorbjørn Ravn Andersen
1
In den Spring-Dokumenten heißt es: "Die @ Named-Annotation von JSR 330 kann verwendet werden, um Komponenten zu erkennen und ihnen einen Namen zu geben. Dieses Verhalten wird automatisch aktiviert, wenn Sie die JSR 330-JAR im Klassenpfad haben." Ist dieses Verhalten nur für Spring oder für alle Container verfügbar, die @Named verstehen?
Ams

Antworten:

87

Verwenden Sie @Nameddiese Option, um zwischen verschiedenen Objekten desselben Typs zu unterscheiden, die im selben Bereich gebunden sind.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Ohne das @NamedQualifikationsmerkmal würde der Injektor nicht wissen, wie lange er an welche Variable binden soll.

  • Wenn Sie Anmerkungen erstellen möchten, die sich wie folgt verhalten @Named, verwenden Sie die @QualifierAnmerkung beim Erstellen.

  • Wenn Sie sich das ansehen @Named, ist es selbst mit Anmerkungen versehen @Qualifier.

Brücken
quelle
@Named ist also wirklich @Qualifier. Warum muss @Qualifier so allgemein sein? Ist es die Idee, jemandem, der javax.inject verwendet, zu erlauben, Stereotypen wie @ Repository, @ Service, @ Controller zu definieren, die als @Qualifier gekennzeichnet sind?
Ams
Ich bin mir nicht sicher, was du mit Stereotypen meinst. Wenn Sie neue Anmerkungen hinzufügen möchten, um zwischen verschiedenen Instanzen desselben Typs zu unterscheiden, dann ja.
Brücken
Beispielsweise könnten Sie anstelle von @Named ("maxWaitTime") @MaxWaitTime haben. Es ist nur ein bisschen sauberer.
Sourcedelica
28
Schöner Artikel über @Namedund @Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko
Ich verstehe nicht ... können Sie den Unterschied zwischen ihnen nicht an ihren verschiedenen Variablennamen erkennen?
CodyBugstein
63

@Injectanstelle von Spring's @Autowired, um eine Bohne zu injizieren.
@Namedanstelle von Spring's @Componenteine Bohne deklarieren.

Diese JSR-330- Standardanmerkungen werden auf dieselbe Weise wie die Spring-Annotation gescannt und abgerufen (sofern sich Folgendes jarin Ihrem Klassenpfad befindet).

Nadav Finish
quelle
Der Ausdruck "eine Bohne injizieren" ist mehrdeutig; Meinen Sie "alle Abhängigkeiten dieser Bean erfüllen" oder "diese Bean in etwas injizieren, das sie als Abhängigkeit hat"?
Andrew Swan
Wo finde ich eine Liste der JSR-Gegenstücke zu Frühlingsanmerkungen?
Pawan
injiziere eine Bohne - "injiziere diese Bohne in etwas, das sie als Abhängigkeit hat"
Nadav Beende
Es tut mir leid, Pawan, ich kenne keine Liste von JSR, die der Frühlingsanmerkung entspricht
Nadav Finish
8

In Bezug auf # 2 gemäß der JSR-330-Spezifikation:

Dieses Paket enthält Annotationen zur Abhängigkeitsinjektion, die portable Klassen ermöglichen, überlässt jedoch die externe Abhängigkeitskonfiguration der Implementierung des Injektors.

Es ist also Sache des Anbieters, zu bestimmen, welche Objekte zur Injektion verfügbar sind. Im Falle des Frühlings sind alles Frühlingsbohnen. Alle mit JSR-330-Annotationen kommentierten Klassen werden bei Verwendung eines AnnotationConfigApplicationContext automatisch als Spring Beans hinzugefügt.

Sourcedelica
quelle
5

Die Hauptaufgabe der Annotation @Named besteht darin, eine Bean zu definieren, um EL-Anweisungen innerhalb der Anwendung aufzulösen, normalerweise über JSF-EL-Resolver. Die Injektion kann unter Verwendung von Namen durchgeführt werden, aber so sollte die Injektion in CDI nicht funktionieren, da CDI uns eine viel umfassendere Möglichkeit bietet, Injektionspunkte und die in sie zu injizierenden Bohnen auszudrücken.

abbas
quelle