2012-05-02 90 views
0

我在使用無狀態EJB時遇到了一個問題。我希望在該EJB中使用特定的靜態方法,但此方法非常重要,並且具有靜態依賴性。使用相同靜態方法的多個無狀態Bean

正如我們所知,無狀態會話bean的實例是根據需求(一個或多個)創建的。那麼如何確保所有的EJB都使用該靜態方法的單個副本。我不確定,但我認爲每個使用靜態方法的不同類都會加載不同的類副本,然後執行不同的靜態方法副本。

而且我不能依靠singleton EJB,因爲它不能保證只有一個副本會保留,因爲如果服務器需要多個JVM。單身EJB的不同副本將存在於不同的JVM中。

在此先感謝。

回答

1

即使您創建了數千個該類的實例,靜態方法也是每個類中的一個,所有這些方法都只會看到您的靜態方法的一個副本。

現在根據規範,你不應該在你的EJB中有靜態方法,你應該考慮把它作爲實用程序的一部分,如果你想要它是靜態的,或者使它不是靜態的。

從規格:

EE.5.2.3註解和注射

如在以下章節中,某些 容器管理組件類的字段或方法描述的,可以註釋要求將 從應用程序組件的環境條目注入 該類。本章中描述的任何類型的資源可能被注入到 中。還可以使用對應於這些資源類型中的每一個的 部署描述符中的條目來請求注入。 該字段或方法可能有任何訪問限定符(公共,私有, 等)。對於除應用程序客戶端主類以外的所有類, 字段或方法不能是靜態的。

+1

我想知道爲什麼它說他們「不能是靜態的」。誰在乎它們是否是靜態的?即使在標準的Java中,靜態方法也是一種黑羊:程序化,而不是面向對象,放置它們並不重要。程序員將靜態方法組織到類中,但由於它們不對對象狀態進行操作,所以選擇有些隨意。 – DavidS

+0

我最近得知「它們不能是靜態的」,因爲靜態方法不參與容器管理事務,AOP,安全性等。如果我們接着問「爲什麼靜態方法不參與AOP等等」我認爲這與EJB/CDI如何使用代理完成其工作有關:代理常常通過實現接口或擴展類來實現,而這些類不能用於靜態方法(類似於[Mockito])(https://stackoverflow.com/問題/ 4482315 /爲什麼此結果的Mockito - 不模擬靜態方法))。 – DavidS

相關問題