2014-10-08 154 views
0

我已閱讀關於使用@Stateful@SessionScoped annonations的不同文章,其中包括this後的差異。從定義的角度來看,@sessionScoped用於在客戶端/網絡層之間需要/創建會話/創建,而Bussiness Logic層需要@Stateful。但是在實施它們時,我仍然沒有認識到真正的差異。下面是一個簡單的例子@stateful和@sessionScoped - 區別以及何時正確使用它們?

@Named 
@SessionScoped 
ShoppingCartUIBean { 

@inject 
    shoppingCart cart; 
    // more code 
} 

@Stateful 
ShoppingCart { 

//business logic of adding/updating/deleting cart items 
} 
  1. 如何HTTP會話由@SessionScoped豆給定用戶和服務器之間保持? 也就是說,如果我在不同的計算機上打開購物車,我應該能夠看到與我的用戶配置文件關聯的購物車。這是如何建立的?
  2. 如果我在上面的bean上切換兩個annonations,會發生什麼情況?它會有什麼作用? (對不起,這可能聽起來很愚蠢,我正在進入Java EE世界,所以我想讓基礎知識正確)。
  3. 根據Differences : @SessionScoped vs @Stateful and @ApplicationScoped vs @Singleton這篇偉大的文章,@Stateful beans很少用於Web應用程序。有沒有這種情況下,@Stateful是絕對必要的?
  4. 相關說明:將@stateful豆注入@ApplicatonScoped bean是否合法?這意味着整個應用程序只有一個@stateful bean,所有客戶端都通過代理使用同一個有狀態bean的實例。 (正如在這裏證明的,不要在servletsEJB example for stateless and stateful beans difference中注入@Stateful)。

感謝。

回答

0

我會盡力用我最好的答案回答你的一些問題。

Ad.1 @SessionScoped是關於瀏覽器會話,所以你不會在不同的計算機(或瀏覽器)上看到相同的會話。

Ad.2由於範圍相同,您不能將這兩個視爲相同的組件。基本思想是EJB和JSF bean依賴於不同的體系結構層。 EJB bean應該實現業務邏輯,而jsf bean應該維護表單和其他UI組件。

Ad.3 @Stateful bean在seam框架中非常有用。使用這些bean和擴展持久性上下文是延遲初始化錯誤的解決方案(可能這是seam創建者使用這些bean的原因)。根據性能我更喜歡無狀態bean,但它幾乎不取決於用例(無論是否保持狀態)。

Ad.4一般來說,你不應該將「範圍更小」的bean注入到「更多範圍」bean中。應用程序範圍將存在,而會話可能會被銷燬,以及這個應用程序bean應該用來取代銷燬的會話bean?

糾正我,如果我錯了任何這個答案。

+1

我認爲你的第四點是錯誤的。對於所有不同的會話,這是一個單一會話bean。單一會話永遠不會被破壞.. – 2014-10-09 18:02:56

相關問題