2016-02-09 25 views
0

我很想知道標註有javax.ejb.Singleton註釋的類的實例的範圍。用JavaEE Singleton註解裝飾的類的範圍是什麼?

我正在研究一個Web應用程序,它包含6個獨立的REST應用程序。這6個應用程序被編譯爲戰爭,並且全部部署在同一個TomEE Web服務器中。

我被迫使用Singleton註釋,因爲我需要一種方法來在Servlet過濾器和服務代碼之間共享數據,並且普通bean的範圍似乎不被過濾器和應用程序共享。爲此,Singleton似乎工作正常(儘管我不喜歡使用Singleton的想法,並且我正在尋找替代方法)。

無論如何,現在我正在使用Singleton,我對它的範圍有疑問。

是否將Singleton實例的範圍限制在每​​個webapp中(其中一個部署的webapps將無法在同一個tomEE中看到與另一個webapp相同的singleton),還是Web服務器在某種程度上共享一個Singleton部署的webapps?

+0

Web應用程序中不是Singletons全局範圍嗎?這是他們不好主意的原因之一。沒有跨網絡應用共享。 – duffymo

回答

2

要回答您的問題,@Singleton EJB在其各自的應用程序中的範圍是嚴格的;他們可能在兩個不同的服務器實例上。如果你有一個可重複的測試用例來證明你最喜歡的EE容器上有相反的情況 - 在這種情況下,TomEE - 它的開發人員會感謝你提供一個錯誤報告。並可能會優先處理它。

至於你的用例:增加範圍總是一個壞主意,只是通常不能相互通信的組件可以這樣做。在你的軟件組件之間建立適當的溝通渠道,並且所有這些都將落實到位。

+0

嗨。感謝您的回答。它很好的保證Singleton的範圍是特定的應用。我並不是說我有一個情況,即Singleton的範圍超出了應用程序範圍,我的意思是ApplicationScoped的範圍似乎沒有包含一個servlet過濾器,但是Singleton的範圍確實如此。出於這個原因,我被迫使用辛格爾頓。關於在過濾器和應用程序的其他部分之間是否共享範圍是否正確的問題,我想它確實有道理,因爲過濾器實際上是應用程序的一部分。 – user3441604

+0

根據某人的說法,我的理解是ApplicationScoped和Singleton之間的主要區別與事務和併發問題有關。如果您可以建議另一種方法讓過濾器與其他應用程序共享信息,請讓我知道!謝謝! – user3441604

+0

'@ ApplicationScoped' CDI bean與EJB'@ Singletons'具有相同的作用域,但是,它們目前缺乏某些您可能會發現哪些EJB單例擁有有用的功能。例如,容器管理的鎖定,啓動順序等。兩者都可以從一個servlet過濾器中使用,你只需要分別使用@EJB和@Inject注入它們。 – NBW