2012-08-31 19 views
11

Ok, quindi ho un bean di supporto JSF che richiede un riferimento a un altro bean (@NoneScoped).Inject vs ManagedProperty

Devo @Inserirlo o utilizzare @ManagedProperty per ottenere un riferimento di istanza dal contenitore?

Perché usare l'uno e non l'altro, nella mia mente i due approcci realizzano la stessa cosa.

risposta

10

@ManagedProperty e @NoneScoped proviene dalla specifica JSF 2.0 mentre @Inject deriva dalle specifiche CDI.

Se si sta solo lavorando su un'applicazione servlet che non fa alcun uso di nessuna delle altre funzionalità di JavaEE 6, andare a @ManagedProperty. Questa annotazione ha anche un vantaggio rispetto allo @Inject: con esso è possibile utilizzare EL (linguaggio delle espressioni) (although there are workarounds to get that in CDI).

Entrambe le annotazioni/contenitori sembrano raggiungere "la stessa cosa" ma in modi molto diversi e funzionano con contenitori diversi. I fagioli gestiti da CDI saranno disponibili per JSF ma non viceversa. Se stai annotando i tuoi bean con annotazioni specifiche JSF, dimentica di usare qualificatori, intercettori, metodi di produzione, ecc. Di solito preferisco l'approccio con CDI perché, alla fine, è più sofisticato ma la scelta dipenderà dalle tue reali esigenze .

avvolgendolo, come sembra che si sta solo utilizzando caratteristiche JSF poi bastone alla @ManagedProperty (CDI non può capire @NoneScoped annotazioni, nel CDI tutti i fagioli sono nell'ambito di applicazione @Default se nessuno specificato). Passare a CDI nel progetto potrebbe significare sostituire non solo lo @ManagedProperty per uno @Inject, ma tutto il tuo @RequestScoped (e così via) per quelli specifici del CDI.

6

Preferirei CDI sui bean gestiti quando possibile. CDI è più ricco nel controllo delle dipendenze in fase di distribuzione e il suo supporto proxy previene la perdita dell'ambito. Ciò semplifica la verifica della correttezza del tuo modello. Producers può essere generalmente utilizzato per fornire il codice della colla laddove necessario.

+2

vorrei aggiungere questo, simile a ciò che è al di sotto, avete cose come EJB è possibile iniettare con CDI. Puoi anche tenerli fuori dalla tua vista se non gli dai un @Name (che li rende semplicemente disponibili a EL). L'uso di CDI offre anche punti di estensione maggiori rispetto a quelli disponibili in JSF, ma ciò non fa parte della domanda :) Suggerisco di attenersi al CDI. – LightGuard