2010-06-21 10 views
13

könnten einige erklären, was ein Bereich ist und Zweck davon?Was ist kein Bereich Bean und wann es zu verwenden?

Angenommen, wenn ich eine Bohne haben in

request scope as r1 

session scope as s1 

application scope a1 

und sagen, dass ich keine Umfang Bohne n1 in jedem der oben genannten Bereiche injizieren dann finde ich, dass n1 für jeden Elternteil Bohne instanziiert wird, wann immer seine Mutter bean [ r1/s1/a1] wird instanziiert.

Kein Bereich Bean in A1 ist überall in A1 verfügbar, da A1 Anwendungsbereich ist. keine scope-bohne in s1 ist nur verfügbar, bis s1 nicht zerstört wird und wenn s1 erstellt wird wieder n1 wird installiert und zur Verfügung gestellt.

Ist es richtig?

und was ist der Verwendungszweck? nur um zu vermeiden, dass wir eine solche Bohne erschaffen?

vielen Dank

+0

Wo haben Sie über "keinen Anwendungsbereich" gelesen? – Bozho

Antwort

19

Eine Bohne mit einem <managed-bean-scope> von none oder einer @NoneScoped Anmerkung wird auf jedem einzelnen EL-Ausdruck erstellt werden, verweist die Bohne. Es wurde nicht von JSF irgendwo gespeichert. Der Aufrufer muss die ausgewertete Referenz gegebenenfalls selbst speichern.

z. die folgenden in der Ansicht

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

auf einem keine-scoped bean wird die bean 3 (drei) mal während einer Anforderung konstruieren. Jeder Zugriff auf die Bean ergibt eine vollständig separate Bean, die unmittelbar nach dem Zugriff auf die Eigenschaft hinzugefügt wird.

jedoch scoped die folgenden in beispielsweise eine Session-Bean

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

wird es, solange die Sitzung scoped Bean-Instanz zu leben machen. Sie sollten nur sicherstellen, dass Sie stattdessen in der Ansicht von #{sessionScopedBean.noneScopedBean.someProperty} darauf zugreifen.

So kann es nützlich sein, wenn Sie möchten, dass Daten ohne Umfang als verwaltete Eigenschaft in einer beliebigen Bean verfügbar sind.

+1

Ich habe den Vorteil, den du erwähnt hast, nicht bekommen ... könntest du bitte ein bisschen ... – Inv3r53

+0

@deadlus: durch Zufall habe ich gerade angefangen, etwas damit zu spielen, nachdem ich die Antwort gepostet habe. Entschuldigung, es hat nicht so funktioniert, wie ich es erwartet habe und ich sehe keine Vorteile mehr. – BalusC

+0

@BalusC "Dieser Bereich kann nützlich sein, wenn Sie verwaltete Eigenschaften in faces-config.xml und nicht direkt in der übergeordneten Bean selbst definieren und deklarieren möchten." Die übergeordnete Bean lässt nicht zu, den Bereich einer verwalteten Eigenschaft durch Annotation zu deklarieren? – Geek

7

Ich benutze @nonescoped, wenn meine "view logic" nicht in irgendeinem Bereich sein muss, aber von einem anderen ManagedBean referenziert wird.

Ich arbeite mit Liferay, wie ich meine Architektur und Design unabhängig von liveray machen möchte, ich meine Dienste Schnittstellen und Dto, aber wenn Sie Persistenz Daten benötigen, Liferay benötigen, dass die CompanyId und CompanyGroupId gesendet werden die Ansichtsebene (in diesem Fall JSF).

Um die Unabhängigkeit zu erhalten, habe ich ein "Adapter Pattern" erstellt, um ein ServiceLayer ManagedBean mit @ noneScope mit einer von Liferay unabhängigen Schnittstelle zu erstellen. Auf diese Weise kann ich die CompanyId und die CompanyGroupId von Liferay Apis erhalten.

Der Vorteil von @noneScope besteht darin, dass Sie es als @ManagedProperty in jeder Bean eines beliebigen Bereichs verwenden können.

0

@NoneScoped würde im folgenden Szenario von Vorteil sein.

Angenommen, wir müssen die gleiche Bohne in zwei verschiedene bereichsabhängige Bohnen injizieren, können wir diese Bohne als @NoneScoped markieren. Nehmen wir an, eine Bohne BeanOne mit @NoneScoped kann einfach in jede Bean mit beliebigem Umfang wie @Request oder @Session eingefügt werden.

Ohne @NoneScoped für BeanOne zu verwenden, müssen wir möglicherweise die Bean mit verschiedenen Bereichen duplizieren und sie entsprechend injizieren.

Verwandte Themen