2012-04-18 112 views
3

我是EJB的新手,最近開始研究EJB(3.0)。我已經使用了Java 6年,但之前從未使用過EJB。至少可以說,我對整個EJB業務的複雜性感到不知所措。我不明白我在哪裏可以實際應用某些概念。無狀態會話Bean vs無狀態Singleton

在瞭解無狀態會話bean之後,我想到的一個問題是,你能不能總是用一個沒有本地成員的類的共享實例替換一個無狀態會話bean(實際上使其成爲無狀態)?我閱讀了關於爲無狀態會話bean完成的實例池。如果沒有狀態,你不能簡單地使用一個實例嗎?

我部署我的OpenEJB的樣本和一個地方,我不得不使用無狀態會話bean是與EntityManager的交互。我不確定是否可以在任意類中處理EntityManager。除此之外,仍然困惑無國界會話bean試圖解決什麼問題。

+0

我認爲這是有爭議的,但是我能不能總是用Spring之類的東西替代EJB,並且還能減少巨大的複雜性嗎?我想到的是,我寫的東西並不一定就像移植到其他應用程序服務器一樣。我遇到了各種各樣的問題,以便在Geronimo,TomEE,GlassFish和JBoss中獲得一個與Hibernate一起使用的簡單Entity bean作爲JPA。只能在沒有太多問題的情況下使用JBoss。這個問題主要與加載Hibernate Jar有關,這些Jar包裝在WEB-INF/lib/ – 2012-04-18 08:38:16

回答

10

無狀態會話bean可能有狀態。但它可能沒有會話狀態。所以這是完全可以接受的會話Bean方法執行以下操作(雖然是不好的做法):

public void foo() { 
    this.someVar = bar(); 
    this.someOtherVar = baz(); 
    zing(); 
} 

另外池,EJB容器提供了多種服務,無狀態bean:

  • 依賴注入
  • 聲明事務劃分
  • 聲明式安全
  • 訪問EJB上下文

所以無狀態會話bean比簡單的無狀態單例更有用。

+0

+1 E.g.一個常見的「臨時狀態」是一個注入的EntityManager,它只能用作「一個工作單元」。 – Puce 2012-04-18 08:51:44

4

沒有,無狀態會話bean可以有狀態,但這種狀態不被持久化/綁定到一個會話。部分狀態是注入EJB或其他可能是有狀態bean的POJO等。因此,每個請求需要一個無狀態會話Bean。

相反你有exlusively有狀態會話bean爲一個用戶會話,因此該狀態被綁定到會話。

0

您可以處理的EntityManager在任意類,但真正的問題是要如何構建您的解決方案。

除了使用EJB的EJB的複雜性給你一個更靈活的解決方案。

由於EJB前面所說,當你正在開發一個基於交易的應用程序非常有用。 應用程序服務器爲您提供了一些事務管理,EJB池,安全性等功能。

當然,你可以用「共享班級」來實現每一件事情,但是當你已經擁有一切空閒的時候,你爲什麼要重新發明輪子?

無狀態會話bean用於將業務邏輯實現爲應用程序的核心部分。 在Java EE分層架構中,您有3層: 1.演示 2.業務 3。數據

EJB在Businness邏輯中扮演着重要的角色。您有兩種選擇 SLSB和SFSB。第一個是可擴展性更強的應用程序服務器,但不能保持其狀態。 第二個可擴展性較差,每個客戶端會話都有一個SFSB。當你必須在客戶端之間保持業務邏輯之間的對話時使用它們,例如,只有一次方法調用才能完成的操作不能在SFSB中完成。 即使我建議您僅使用SLSB來管理持久性,SLSB和SFSB也可以持有對EntityManager的引用來管理實體持久性。 EJB3和JPA是一個很好的解決方案。 希望對你有所幫助