2013-10-12 51 views
4

我在讀this post,它讓我有些困惑:在那篇文章中,提到了每個特定容器使用哪個註釋:JSF,CDI或EJB容器。JSF,CDI和EJB容器:應該使用哪些組合?

作爲一名初學者,我學習了JSF框架,並習慣了它的@ManagedBean註解和它的可選名稱參數,以便從JSF頁面引用bean,並且對CDI不太瞭解,並且我將EJB用於其強大的功能相反(甚至在閱讀這篇文章後,我仍然認爲EJB比CDI更強大,更有特色)。

所以.. JSF和CDI容器都有自己的註釋和方法來引用網頁上的bean,但EJB只有@Stateless(或@Stateful),因此不能在Web頁面上引用,這意味着JSF容器必須總是附加EJB(因爲我認爲混合EJB和CDI容器是荒謬的,因爲它們幾乎相似,但是對於這一點,我希望有人告訴我,如果我錯了)。

與JSF容器的問題是,它的

「還是不完整的,成熟的集裝箱」

如對文章中說,我知道關於它的最糟糕的是在Netbeans的警告消息旁邊@ManagedBean:

「從javax.faces.bean將在 接下來的JSF版本deprected包註釋CDI的有薦取而代之「。

(當然,這裏還有另外一種選擇包爲註釋:javax.annotation.ManagedBean,但我也不知道,如果我可以使用它,也沒有其是否具有在網頁上引用豆參數它是哪一個)

所以現在我開始懷疑未來還有關於我應該使用哪種容器組合。 CDI + EJB是未來嗎?

爲所有人歡呼。

回答

10

Java EE 7正在變得更加CDI對齊。因此,EJB將僅僅是CDI +強大服務(異步,消息使用者,計劃任務等)的一個特例。考慮到這一點,@ManagedBean變得多餘,因爲@Named允許您將一個bean公開給JSF頁面。

隨着技術的成熟,你將與CDI容器到處(甚至是獨立的應用程序)結束。

幾點要牢記:

  • 服務層不僅是@Stateless@Stateful。現在,每個類都可以被注入(並且使用這意味着攔截,生命週期管理,資源注入的服務)。
  • 介紹不僅爲@ManagedBean。每個@Named可能在網頁後面有一個相關的作用域(session,view ...)
  • 不僅僅是EJB是事務性的,現在每個@Named@Transactional(Java EE 7)都可以寫入數據庫。

架構得到簡化,模式是相同的(MVC,邊界控制實體),只需更改註釋和一點點你的實現。

目前有一個名爲Apache DeltaSpike的成熟項目,其中包含一些相關CDI擴展,這些擴展可移植,並且在大多數情況下會簡化您的生活(即使您正在使用Java EE 6!)。

注意:由於6沒有@Transactional,所以您需要自己創建一個事務攔截器,可以更容易在Java EE 7中使用完整的CDI而不是Java EE 6。

DeltaSpike說:

非EJB豆事務支持:事務攔截 在DeltaSpike鋪平了道路,@Transactional中的Java EE 7

2

首先,我想要區分EJB和JSF Managed Beans。 EJB是持久對象,作爲一般規則,不能將它們直接用作JSF受管對象,因爲JSF對象管理子系統不支持數據庫的需要。最重要的是,用不同的鍵交換對象的實例。您的所有數據庫操作都需要應用程序代碼,因爲JSF無法幫助您。它不是爲了這樣做而設計的。

對於傳統管理 CDI:除非甲骨文執行「微軟」並放棄傳統的對不推薦項目的長期支持,否則使用舊式ManagedBean註釋應該更安全。事實上,取決於您所針對的Enterprise Java容器的版本,CDI可能還沒有正常運行。

如果您確定您將始終擁有CDI支持,那麼最好編碼給CDI,因爲它是指定用於長期支持的那個。