2012-09-27 16 views
5

Sto usando l'implementazione Weld di CDI 1.0 e non riesco a trovare il modo in cui rendere il bean pigro come in Spring (usando @Lazy o lazy-init in XML). C'è un modo per dire a CDI di Injector di non inizializzare bean all'avvio?Come rendere pigramente inizializzato un bean CDI?

+0

Duplicato di http://stackoverflow.com/questions/15920758/java-ee-6-inject-lazy –

risposta

6

No, questo non è possibile in CDI. La cosa più vicina che si potrebbe ottenere sarebbe quella di creare una nuova implementazione di InjectionPoint (usando un'estensione) che fornisce un proxy e il proxy inizializzerà tutto sul primo richiamo del metodo.

+0

Quindi, utilizzando l'istanza @Inject beantypeProvider; questo dovrebbe funzionare bene? –

+1

Um, la mia prima reazione è di dire che potrebbe funzionare. Anche se si sta utilizzando un'istanza di implementazione di CDI 1.0, la memoria di perdite delle istanze con scope dipendenti viene perduta. – LightGuard

+0

Di quale implementazione stai parlando? dov'è il tuo riferimento? –

4

Vedere la mia risposta su: http://www.adam-bien.com/roller/abien/entry/lazy_injection_with_javax_inject

Utilizzando

@Inject 
Instance<MyObject> object; 

il fagiolo viene inizializzato solo quando necessario ... non è che ciò che si vuole?

+0

[secondo Adam Bien] (http://www.adam-bien.com/roller/abien/entry), c'è un'alternativa a questo che potrebbe essere un po 'più leggero: semplicemente iniettando un 'Provider ' invece di un' Istanza ', tutto il resto è lo stesso. –

+1

@Hein Blöd Il collegamento alla voce nel blog di Adam Bien è stato modificato in [Lazy Injection con javax.inject.Provider] (http://www.adam-bien.com/roller/abien/entry/lazy_injection_with_javax_inject). – ltlBeBoy

+0

ha aggiornato la risposta, grazie –

0

Se il bean che si sta iniettando si trova in un ambito normale (@SessionScoped, @RequestScoped ecc.), Verrà istanziato pigramente. Quello che ottieni nel tuo client bean è un proxy che non punta a un'istanza concreta fino alla prima volta che invochi un metodo sul proxy.

Come altri hanno già indicato, @Inject Instance<MyBean> myBeanInstance; può anche essere utilizzato per stabilire un'istanza lazy esplicita.

Problemi correlati