Per cosa dovrebbe essere usata l'annotazione javax.inject.Named?


114

Sto cercando di capire il javax.injectpacchetto e non mi è chiaro per cosa javax.inject.Nameddovrebbe essere utilizzata l' annotazione. Il Javadoc non spiega l'idea alla base.

Javadoc è su http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Sto usando Spring 3.0 per scrivere alcuni programmi di esempio, inserendo @Namedun bean sembra aggiungerlo al bean factory ma la descrizione Javadoc è così leggera che non posso dire se questo è il comportamento standard o il comportamento specifico di Spring.

Le mie domande sono:

  1. Qual è la differenza tra @Namede@Qualifier
  2. Come dovresti dire al sistema Runtime che una classe dovrebbe essere iniettabile in altre classi qual è l'annotazione per questo? L'equivalente di @Componentin primavera?

Aggiornamento 1 c'è un'eccellente spiegazione di @Namede @Qualifierin un bell'articolo su @Namede @Qualifier https://dzone.com/articles/java-ee6-cdi-named-components grazie @xmedeko per il collegamento ad esso il commento qui sotto.


La configurazione di JSR-330 è al di fuori delle specifiche, ovvero specifica del contenitore.
Thorbjørn Ravn Andersen

1
Secondo i documenti di Spring "l'annotazione @Named di JSR 330 può essere utilizzata sia come mezzo per rilevare i componenti sia per fornire loro un nome. Questo comportamento viene abilitato automaticamente se si dispone del JAR JSR 330 sul classpath." questo comportamento è unico per spring o per tutti i contenitori che comprendono @Named?
AMS

Risposte:


87

Utilizzare @Namedper distinguere tra diversi oggetti dello stesso tipo associati nello stesso ambito.

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Senza il @Namedqualificatore, l'iniettore non saprebbe quale tempo associare a quale variabile.

  • Se vuoi creare annotazioni che agiscono come @Named, usa l' @Qualifierannotazione quando le crei.

  • Se guardi @Named, è esso stesso annotato con @Qualifier.


Quindi @Named è davvero @Qualifier, quindi perché @Qualifier deve essere così generico, l'idea di consentire a qualcuno che utilizza javax.inject di definire stereotipi come @ Repository, @ Service, @ Controller che sono contrassegnati come @Qualifier?
AMS

Non sono sicuro di cosa intendi per gli stereotipi. Se intendi aggiungere nuove annotazioni per distinguere tra diverse istanze dello stesso tipo, allora sì.
ponti

Ad esempio, invece di @Named ("maxWaitTime") potresti avere @MaxWaitTime. È solo un po 'più pulito.
sourcedelica


Non capisco ... non puoi dire la differenza tra loro dai loro diversi nomi di variabile?
CodyBugstein

64

@Injectinvece di Spring's @Autowiredper iniettare un fagiolo.
@Namedinvece di Spring's @Componentper dichiarare un fagiolo.

Quelle annotazioni standard JSR-330 vengono scansionate e recuperate allo stesso modo dell'annotazione Spring (purché quanto segue jarsia nel percorso di classe)


La frase "inject a bean" è ambigua; intendi "soddisfare tutte le dipendenze di quel bean" o intendi "iniettare quel bean in qualcosa che lo ha come dipendenza"?
Andrew Swan

Dove posso trovare l'elenco delle controparti JSR per le annotazioni primaverili?
Pawan

inject a bean - "Inject that bean into something that has it as a dependency"
Nadav Fine

Mi dispiace Pawan, non ho familiarità con un elenco di JSR che equivalgono all'annotazione primaverile
Nadav Finish

8

Per quanto riguarda # 2, secondo la specifica JSR-330:

Questo pacchetto fornisce annotazioni di inserimento delle dipendenze che abilitano le classi portabili, ma lascia la configurazione delle dipendenze esterne all'implementazione dell'iniettore.

Quindi spetta al provider determinare quali oggetti sono disponibili per l'iniezione. Nel caso della primavera sono tutti fagioli primaverili. E qualsiasi classe annotata con annotazioni JSR-330 viene automaticamente aggiunta come bean Spring quando si utilizza AnnotationConfigApplicationContext.


5

Il ruolo principale dell'annotazione @Named è definire un bean allo scopo di risolvere le istruzioni EL all'interno dell'applicazione, di solito tramite i risolutori JSF EL. L'iniezione può essere eseguita usando i nomi, ma non era così che doveva funzionare l'iniezione in CDI poiché CDI ci offre un modo molto più ricco per esprimere i punti di iniezione e i fagioli da iniettare in essi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.