2010-06-21 8 views
13

¿podrían algunos explicar cuál es el alcance y el propósito del mismo?¿Qué es el bean scope y cuándo usarlo?

Supongamos que si tengo un frijol en

request scope as r1 

session scope as s1 

application scope a1 

y decir que inyecto ninguno n1 frijol alcance para cada uno de los ámbitos anteriores, entonces me parece que n1 consigue instanciado para cada grano de los padres, cuando cada vez su grano de los padres [ r1/s1/a1] está instanciado.

Ninguno scope bean en a1 está disponible en todo el a1, ya que a1 es ámbito de aplicación. ninguno scope bean en s1 está disponible solo hasta s1 no se destruye y cuando se crea s1 nuevamente se instancia y se pone a disposición n1.

¿Es correcto?

y ¿para qué sirve? solo para evitar crear ese frijol nuestro ser?

muchas gracias

+0

¿Dónde leyó sobre "ningún alcance"? – Bozho

Respuesta

19

Un grano con un <managed-bean-scope> de none o una anotación @NoneScoped se crearán en cada expresión única EL referencia al frijol. No ha sido almacenado por JSF en ningún lado. La persona que llama debe almacenar la referencia evaluada, si es necesario.

E.g. el siguiente en la vista

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

en un grano de ninguno de ámbito se construir los 3 (tres) veces de frijol durante una petición. Cada acceso al frijol proporciona un frijol completamente separado que se guarda en la basura inmediatamente después del acceso a la propiedad.

Sin embargo, en la siguiente, por ejemplo, una sesión con ámbito de frijol

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

hará que viva siempre y cuando la sesión en ámbito instancia del bean. Solo debe asegurarse de tener acceso a él en la vista al #{sessionScopedBean.noneScopedBean.someProperty}.

Por lo tanto, puede ser útil cuando desee que los datos sin ámbito estén disponibles como propiedad administrada en un bean arbitrario.

+1

no obtuve el beneficio que ha mencionado ... ¿podría por favor elaborar un poco ... – Inv3r53

+0

@deadlus: por coincidencia, empecé a jugar un poco con eso después de haber publicado la respuesta. Lo siento, no funcionó como esperaba y ya no veo ningún beneficio. – BalusC

+0

@BalusC "este alcance puede ser útil cuando quiera definir y declarar propiedades administradas en faces-config.xml en lugar de directamente en el propio bean padre". ¿El bean padre no permite declarar el alcance de una propiedad administrada a través de una anotación? – Geek

7

Estoy usando @nonescoped cuando mi "lógica de visualización" no necesita estar en ningún ámbito pero debe ser referenciada por otro ManagedBean.

Estoy trabajando con Liferay, ya que quiero hacer que mi arquitectura y diseño sean independientes de liferay, creo mis interfaces de servicios y Dto, pero cuando necesitas datos de persistencia, Liferay necesita que el Id de la compañía y el de Grupo de la compañía sean enviados desde la capa de vista (en este caso JSF).

Para mantener la independencia, hice un "Patrón de adaptador" creando un ServiceLayer ManagedBean con @noneScope con una interfaz independiente de Liferay. De esta forma puedo obtener el Id de la compañía y el ID de Grupo de la compañía que necesita Liferay Apis.

La ventaja de usar @noneScope es que puede usarlo como @ManagedProperty en cualquier bean de cualquier alcance.

0

@NoneScoped sería beneficioso en la siguiente situación.

Supongamos que tenemos que inyectar el mismo bean en dos beans de ámbito diferente, podemos marcar ese bean como @NoneScoped. Digamos que un bean BeanOne con @NoneScoped se puede inyectar fácilmente en cualquier bean con cualquier ámbito, como @Request o @Session.

Sin utilizar @NoneScoped para BeanOne, es posible que tengamos que duplicar el bean con diferentes ámbitos e inyectarlos en consecuencia.

Cuestiones relacionadas