2010-06-21 32 views
13

Qualcuno potrebbe spiegare quale non è uno scopo e scopo?cosa non ha scope scope e quando usarlo?

Supponiamo che se ho un fagiolo in

request scope as r1 

session scope as s1 

application scope a1 

e dire che mi inietto nessuno n1 portata fagiolo in a ciascuno di scopi di cui sopra, allora trovo che n1 ottiene istanziato per ciascun bean genitore quando mai il suo fagiolo genitore [ r1/s1/a1] è istanziato.

nessuno scope scope in a1 è disponibile in tutto in a1 poiché a1 è l'ambito appl. nessuno scope bean in s1 è disponibile solo fino a quando s1 non viene distrutto e quando s1 viene creato di nuovo n1 viene instanciato e reso disponibile.

E 'corretto?

e quale è lo scopo di utilizzarlo? solo per evitare di creare tale fagiolo da soli?

molte grazie

+0

Dove hai letto di "nessuno scopo"? – Bozho

risposta

19

Un fagiolo con un <managed-bean-scope> di none o un'annotazione @NoneScoped verranno creati su ogni singola espressione EL riferimento fagiolo. Non è stato memorizzato da JSF ovunque. Il chiamante deve memorizzare lo stesso riferimento valutato, se necessario.

E.g. il seguente nella vista

<p>#{noneScopedBean.someProperty}</p> 
<p>#{noneScopedBean.someProperty}</p> 
<p>#{noneScopedBean.someProperty}</p> 

su un bean nessuno con ambito sarà costruire 3 (tre) volte fagiolo durante una richiesta. Ogni accesso al bean fornisce un bean completamente separato che è stato garbato immediatamente dopo l'accesso alla proprietà.

Tuttavia, quanto segue in, ad esempio una sessione bean con scope

@ManagedProperty("#{noneScopedBean}") 
private NoneScopedBean noneScopedBean; 

renderà a vivere più a lungo la sessione ambito bean. Devi solo assicurarti di accedervi nella vista al numero #{sessionScopedBean.noneScopedBean.someProperty}.

Quindi può essere utile quando si desidera che i dati senza scope siano disponibili come proprietà gestita in un bean arbitrario.

+1

non ho avuto il vantaggio che hai menzionato ... potresti per favore elaborare un po '... – Inv3r53

+0

@deadlus: per coincidenza, ho appena iniziato a giocare un po' con esso dopo aver postato la risposta. Spiacente, non ha funzionato come mi aspettavo e non vedo più alcun beneficio. – BalusC

+0

@BalusC "questo ambito può essere utile quando si desidera definire e dichiarare le proprietà gestite in faces-config.xml piuttosto che direttamente nel bean padre stesso." Il bean parent non consente di dichiarare l'ambito di una proprietà gestita attraverso l'annotazione? – Geek

7

Sto usando @nonescoped quando la mia "logica di visualizzazione" non deve essere in alcun ambito ma essere referenziata da un altro ManagedBean.

Sto lavorando con Liferay, poiché voglio rendere la mia architettura e il mio design indipendente da liferay, creo le mie interfacce di servizi e Dto, ma quando hai bisogno di dati di persistenza, Liferay ha bisogno che l'azienda e il gruppo aziendale vengano inviati da il livello vista (in questo caso JSF).

Per mantenere l'indipendenza, ho eseguito un "modello adattatore" creando un ManagedBean ServiceLayer con @noneScope con un'interfaccia indipendente da Liferay. In questo modo posso ottenere l'ID azienda e il gruppo aziendale necessari per Liferay Apis.

Il vantaggio dell'utilizzo di @noneScope è che è possibile utilizzarlo come una proprietà @ManagedProperty in qualsiasi bean di qualsiasi ambito.

0

@NoneScoped sarebbe utile nel seguente scenario.

Supponiamo di dover iniettare lo stesso bean in due bean con scope diversi, possiamo contrassegnarlo come @NoneScoped. Supponiamo che un bean BeanOne con @NoneScoped possa essere facilmente iniettato in qualsiasi bean con qualsiasi scope come @Request o @Session.

Senza utilizzare @NoneScoped per BeanOne, potrebbe essere necessario duplicare il bean con diversi ambiti e iniettarli di conseguenza.