2012-02-10 16 views
12

Ho una domanda circa la @Inject annotazioni in Java EE 6:Java EE 6: @Inject e grado <T>

Qual è la differenza tra:

@Inject 
private TestBean test; 

@Inject 
private Instance<TestBean> test2; 

Per avere il riferimento:

test2.get(); 

Alcune informazioni su istanza: http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

Forse non crea l'oggetto fino a quando non viene chiamato da get()? Volevo solo sapere qual è il migliore per la memoria jvm. Penso che direct @Inject creerà direttamente un'istanza dell'oggetto, anche se non è utilizzata dall'applicativo ...

Grazie!

+1

La mia risposta è stata sufficiente o forse ho frainteso la tua domanda? Se per caso l'hai trovato utile, non dimenticare di votarlo e/o contrassegnarlo come accettato. Grazie! –

risposta

6

Il secondo è ciò che viene chiamato l'iniezione differita o l'inizializzazione. Il tuo contenitore sceglierà di fare il lavoro di localizzazione, inizializzazione e iniezione di un oggetto appropriato per TestBean finché non chiami get() nella maggior parte dei casi.

Per quanto riguarda "quale è meglio", è necessario rimandare alle regole di ottimizzazione. Non ottimizzare fino a quando non si verifica un problema e utilizzare un profiler.

Un'altra parola, usa la prima a meno che tu non possa provare definitivamente che la seconda ti sta facendo risparmiare una quantità significativa di memoria e CPU.

Fammi sapere se questo risponde alla tua domanda!

+0

Thx per la risposta, infatti ho voluto usare questo per il quadro Vaadin (sulla base di GWT) e volevo sapere se mettere tutti i componenti dell'interfaccia utente come Inject ucciderà performences come: @Inject schermata di login loginscreen Infatti, all'inizio dell'applicazione, caricherà tutte le iniezioni sulla jvm che possono causare meno prestazioni se l'utente non le usa ... – jihedMaster

+1

Sinceramente dubito che si vedrebbe un impatto sulle prestazioni dall'iniezione diretta.Vorrei andare su quella strada di sicuro e non rischiare il debito tecnico! In primavera ho scritto massicce applicazioni iniettate con oltre 50 fagioli e ho avuto un impatto minimo sulla DI. –

+0

Quindi vuol dire che fare molta annotazione Inject in jee 6 non diminuisce le performance per il client? – jihedMaster

10

Ulteriori informazioni su casi di utilizzo per esempio può essere trovato nella documentazione:

In certe situazioni, l'iniezione non è il modo più conveniente per ottenere un riferimento contestuale. Ad esempio, esso non può essere utilizzato quando:

  • tipo fagiolo o qualificatori variano dinamicamente a runtime
  • potrebbe non esserci fagiolo che soddisfa il tipo e qualificatori
  • vorremmo iterare su tutti fagioli di un certo tipo

Questo è piuttosto fresco in modo da poter fare qualcosa di simile

@Inject @MyQualifier Instance<MyType> allMycandidates; 

Quindi è possibile ottenere un iteratore da tutti i myCandidates e iterare su tutti gli oggetti qualificati.