2011-03-24 13 views
81

Sto cercando di capire il pacchetto javax.inject e non sono chiaro per cosa si debba utilizzare l'annotazione javax.inject.Named. Javadoc non spiega l'idea alla base.Cos'è l'annotazione javax.inject.Named che si suppone debba essere utilizzata?

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

Sto usando Primavera 3.0 per scrivere alcuni programmi di esempio, mettendo @Named su un fagiolo sembra per aggiungerlo alla fabbrica di fagioli, ma la descrizione Javadoc è così leggero che posso' dire se questo è il comportamento standard o il comportamento specifico di Spring.

Le mie domande sono:

  1. Qual è la differenza tra @Named e @Qualifier
  2. Come si suppone di dire al sistema di runtime una classe dovrebbe essere iniettabile in altre classi che cosa è l'annotazione per questo? L'equivalente di @Component in primavera?

Update 1 v'è una eccellente spiegazione di @Named e @Qualifier a Nizza articolo circa @Named e @Qualifierhttp://java.dzone.com/articles/java-ee6-cdi-named-components grazie @xmedeko per il collegamento ad essa il commento qui sotto.

+0

La configurazione di JSR-330 è al di fuori della specifica, vale a dire specifica del contenitore. –

+1

In base ai documenti di Spring "L'annotazione @Named di JSR 330 può essere utilizzata come mezzo per rilevare i componenti e per fornire loro un nome. Questo comportamento viene abilitato automaticamente se si dispone del JAR JSR 330 sul classpath." questo comportamento è unico per la primavera o per tutti i contenitori che comprendono @Named? – ams

risposta

54

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

@Named("maxWaitTime") 
public long maxWaitTimeMs; 

@Named("minWaitTime") 
public long minWaitTimeMs; 

Senza il qualificatore @Named, l'iniettore non saprebbe a quale lunghezza associare a quale variabile.

Se si desidera creare annotazioni che si comportano come @Named, utilizzare l'annotazione @Qualifier durante la loro creazione. Se si guarda @Named, è esso stesso annotato con @Qualifier.

+0

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

+0

Non sono sicuro di cosa intendi sugli stereotipi. Se intendi aggiungere nuove annotazioni per distinguere tra diverse istanze dello stesso tipo, allora si. – sbridges

+0

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

7

Riguardo # 2, secondo la JSR-330 spec:

Questo pacchetto fornisce dipendenza annotazioni iniezione che consentono classi portatili, ma lascia configurazione dipendenza esterna fino alla realizzazione dell'iniettore.

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

31

@Inject invece di Spring's @Autowired per iniettare un bean.
@Named invece di @Component di Spring per dichiarare un bean.
Tali JSR-330 annotazioni standard sono analizzati e recuperati allo stesso modo di annotazione Spring (purché il seguente giara è in classpath)

+0

La frase "iniettare un fagiolo" è ambigua; intendi "soddisfare tutte le dipendenze di quel fagiolo" o intendi "iniettare quel fagiolo in qualcosa che lo ha come dipendenza"? –

+0

Dove posso trovare l'elenco delle controparti JSR per le annotazioni a molla? – Pawan

+0

iniettare un bean - "iniettare quel bean in qualcosa che lo ha come dipendenza" –

2

Il ruolo primario dell'annotazione @Named è quello di definire il fagiolo per lo scopo di risolvere le istruzioni EL all'interno dell'applicazione, solitamente tramite i resolver EL JSF.L'iniezione può essere eseguita usando i nomi, ma non è così che l'iniezione in CDI è stata pensata per funzionare poiché CDI ci offre un modo molto più ricco per esprimere i punti di iniezione e i fagioli da iniettare in essi.

Problemi correlati