2012-03-06 101 views
0

我想訪問無接口Singleton MySingleton的多個實例singletonAsingletonB。這些實例中的另一單例類Configurator首先定義:EJB 3.1的多個實例無接口Singleton /有狀態會話Bean

MySingleton.java

@Singleton 
@LocalBean 
public class MySingleton { 
    ... 
} 

Configurator.java

@Singleton 
@Startup 
@LocalBean 
public class Configurator { 
    @EJB MySingleton singletonA; 
    @EJB MySingleton singletonB; 
} 

上面的代碼,appearently工作。

現在,我需要在一個消息驅動Bean注入MySingleton的這2個實例:

MDB.class

@Stateless 
public class MDB implements MessageListener { 
    @EJB (lookup="?")  MySingleton singletonA; 
    @EJB (mappedName="??") MySingleton singletonB; 
} 

但在這一點上,我完全失去了。我知道我可以通過將2個實例定義爲一個獨特接口的2個(空)實現來使事情更簡單。但我有一些問題,因爲該類包含一些非靜態字段,所以我無法將其定義爲接口。

由於MDB的性質EDIT

,我無法通過引用傳遞的單身。 最後,我想避免創建兩個相同的MySingleton實現。

感謝收到的答案,我一直在重新思考整個架構,我必須同意MySingleton定義爲有狀態的事實也會很好。

+0

基於編輯:單身人士通常與Stateful大不相同,但他們更符合Stateless bean。當你重新設計你的應用程序時,你可以考慮這個事實。無狀態和Singleton都在請求的基礎上工作(一般情況下)並且不保持狀態。 – Bala 2012-03-07 20:44:44

回答

1

首先,在配置MySingleton singletonAMySingleton singletonB相同。這是因爲@Singleton的整個觀點是隻有一個實例,無論注入次數多少(在同一個JVM中)。容器在第一次注入之前創建實例,之後將共享相同的實例。所以你可以去注入(而不是一次)它在AnotherEJB

即使我們假設沒有Singleton的情況下(例如Staless),使用@EJB進行注射也不會在其他地方產生可用於注射的新條目。所以如果你在類A中通過@EJB注入某些東西,那麼你不能通過注入到類B的通道引用。要傳遞引用,方法調用是很好的方法。

+0

同意只有一個實例的單例。如果我讓它有狀態我怎麼能得到AnotherEJB中的2個引用? – perissf 2012-03-06 21:25:11

+0

你可以有兩個(但不同的實現)單身人士,只需將它們注入需要它們的地方。一般而言,您可以在方法調用中傳遞對bean的引用,而不是通過注入。使bean有狀態或無狀態在如何在別處引用它時不會發生太大的變化。 – 2012-03-06 21:35:32

+0

謝謝。我知道我沒有很好地表達AnotherEJB的真實性質......我剛剛編輯了我的問題 – perissf 2012-03-06 21:47:21

3

我猜你認識到這是一個矛盾。 A @Singleton只有一個實例,所以你不能有兩個。也許你需要另一種豆(一@Stateful EJB例如)

+0

是的,有狀態可能是正確的選擇 – perissf 2012-03-06 21:23:07

相關問題