2012-09-26 61 views
2

我是JavaEE和EJB的新手。 我做了我的第一個幾步,但是關於基本的註釋有很多,我不明白,不管我花了多少時間在Google上搜索和閱讀電子書。 也許有人可以幫忙或向我推薦一個很好的解釋。EJB-Annotations問題

@ Stateful/@ Stateless 我想我理解了基本概念。但是默認使用哪一個?

@ ManagedBean/@命名爲 @Named Annotaion與@ManagedBean相同,只是使用自定義名稱?

@ Sessionscoped/@ Requestscoped 這些干擾@ Stateful/@ Stateless嗎? 根據我的理解,將@Stateless與@Sessionscoped配對是沒有意義的,因爲@Stateless bean位於服務器的這個「Bean-Pool」中,並且用於單方法調用而不是持久任務。基於這個邏輯,我會認爲擁有一個@Requestscoped @Stateful bean是沒有意義的,因爲在Bean的初始HTTP請求之後,它與客戶端「斷開連接」。

我得到我的程序工作,但我怎麼現在如果我做到了高效率,如果我實際上不知道我在做什麼?

回答

5

AD 1.無「默認」。一個EJB必須被聲明爲一個EJB,你可以用@Stateless,@Stateful,@Singleton,@MessageDriven來註釋它。

如果您沒有它們中的任何一個而不是EJB,那麼就沒有辦法定義「默認」值。

AD 2.其實有此事2 @ManagedBeanjavax.faces onejavax.annotation one

坦率地說,我不知道從哪裏javax.annotation@ManagedBean真的使用。它聲明這個bean是由容器管理的,所以它的生命週期是受控的 - 但是什麼容器控制它呢?我以某種方式感覺它已經過時了,因爲有@Named,javax.faces @ManagedBean,EJB的註釋和CDI註釋 - 它們都將它們的註釋類定義爲管理的,但明確定義了管理它們的容器。

@Named定義了一個可以使用的CDI bean。在JSF視圖(UEL表達式)中。 @ManagedBean定義了一個JSF託管bean。它們通常可以互換使用,但您應該注意到一些差異,例如@Named您使用的bean不能註釋爲JSF @ViewScoped,因爲@ViewScoped只能應用於JSF管理的bean。

AD 3.我認爲您不應該將CDI範圍與EJB範圍混合。這是經常困惑的事情,如果未來的Java EE解決了這個問題,那將會很好。

EJB豆(@Stateless/@Stateful)有自己的生命週期和CDI豆(@SessionScoped@RequestScoped)得到了自己。
我不確定混合這些註釋會得到什麼 - 也許是一個例外,也許是一些黑魔法錯誤,或者它可能實際上按照您的意願工作。
我想這完全是實現者依賴的,因爲我不記得它在EJB/CDI規範中定義的。我不會依賴它。

+0

謝謝,這真的清除了事情! 我一直認爲這一定很容易,但不知何故,我必須重讀這些註釋是如何相互關聯的。 – fancy

+0

很高興我可以幫助你:-)嗯,如果你剛開始使用Java EE,我發現那些東西真的搞砸了,我真的希望未來的Java EE能夠解決這些問題(比如範圍)。例如。可能有一個CDI坐在覈心位置,所有其他容器都使用特定的構造型,比如EJB只是一個具有'@ RequestScoped','@ Transactional'的CDI。然而,有時候很難爲簡單的問題得到答案:-)乾杯! –