2012-03-24 3 views
2

Nur ein Zweifel darüber, wie JSF-Session-Management arbeitetSpeichert JSF meine Hilfsklasse, auf die auch in meiner ManageBean in der Sitzung verwiesen wird?

bekam ich ein managedbean wie:

@ManagedBean(name="loginBean") 
@SessionScoped 
public class LoginBean implements Serializable 
{ 

     private String userName; 
     //getter and setter 

     private String password; 
     //getter and setter 

     // Getting through spring injection 
     @ManagedProperty(value="#{userBO}") 
     private UserBO userBO; 
     //setter method 

     public fetchUserDetails(){ 
     User user = userBO.getUSer(this.userName); 
     //some processing 
     } 
    // more methods 
    . 
    . 
    . 
} 

seit So, jetzt die Bohne ist sessionScoped, JSF meine "userBO" auch in der Session-Objekt halten? Ich glaube, dass Variablen mit den Setter und Getter wahrscheinlich in der Sitzung gespeichert werden. Korrigiere mich, wenn ich falsch liege. Oder muss ich "userBO" als transient deklarieren, so dass es ignoriert wird?

Antwort

2

Wenn Ihre Sitzung im Speicher zwischen Anforderungen beibehalten wird, werden alle anderen Objekte, auf die sie verweist, beibehalten und sind nicht für die Garbage Collection geeignet. Es gibt keine Aufgabe, die die Interna eines Objekts durchläuft, die Referenzen auf null setzen. Verwaltete Eigenschaften werden nur beim Erstellen der Bean und vor dem Einfügen in den Geltungsbereich ausgewertet.

Einstellung userBO auf transient würde nur dann eine Wirkung haben, wenn die Sitzung serialisiert wurde (über Passivierung auf die Festplatte, über die Sitzungsreplikation, etc.)

+0

Session Persistence ist Server abhängig ist, und ich wounldn't dass steuern möchten. Also meinst du, mein userBO ist auch sessionScoped? Das ist schlecht:/ – Akshat

+0

Sitzungsobjekte unterscheiden sich in dieser Hinsicht nicht von anderen Objekten in der VM. Harte Referenzen bedeuten, dass Objekte nicht als Müll gesammelt werden können. Vielleicht können Sie 'userBO' auf null setzen, nachdem Sie damit fertig sind (siehe auch '@ PostConstruct'.) Oder Sie müssen Ihr Bean-Design erneut aufrufen, wenn Objekte außerhalb des Gültigkeitsbereichs geleakt werden - Sie könnten ein Request-Scope-Objekt verwenden um Ihr Session-Scope-Objekt mit 'userBO' zu füllen. – McDowell

+0

Danke, ich vermutete das gleiche. Anscheinend ist die beste Option, die ich hier sehe, meine ManagedBeans als requestScoped zu machen und meine Session-Objekte manuell zu setzen:/ – Akshat

Verwandte Themen