2012-08-31 30 views
11

好了,所以我有JSF支持bean需要另一個(@NoneScoped)bean的引用。進樣VS ManagedProperty

我應該@Inject或使用@ManagedProperty獲得來自容器實例引用?

爲什麼要使用一個,而不是其他,在我心中這兩種方法實現同樣的事情。

回答

10

@ManagedProperty@NoneScoped來自JSF 2.0規範,而@Inject來自CDI規範。

如果您只是在處理不使用任何其他JavaEE 6功能的servlet應用程序,則請參閱@ManagedProperty。那註釋也有反對@Inject一個優勢:你可以用它(although there are workarounds to get that in CDI)使用EL(表達式語言)。

這兩個註釋/容器似乎都實現了「同樣的事情」,但以非常不同的方式,它們使用不同的容器。由CDI管理的豆類將可供JSF使用,但不能反之亦然。如果您正在使用JSF的特殊註解註釋的豆然後忘了使用自定義的預選賽,攔截器,製作方法等,我通常喜歡的方式與CDI,因爲在最後,這是更復雜的,但選擇將取決於您的實際需要。

結束工作,因爲它似乎你只是使用JSF的功能,然後固守@ManagedProperty(CDI無法理解@NoneScoped註解,在CDI如果沒有指定所有的豆類都是下@Default範圍)。在您的項目中切換到CDI可能意味着替換的@Inject一個,但是所有的@RequestScoped(以此類推)爲CDI特定的。

6

我贊成在CDI管理的bean只要有可能。 CDI在部署時依賴性檢查更豐富,其代理支持可防止範圍泄漏。這樣可以更容易地驗證模型的正確性。通常可以使用Producers來在必要時提供膠水代碼。

+2

我想補充一點,類似於下面的,你有東西像EJB時,您可以使用CDI注入。如果你不給他們一個@Name(這只是讓他們可用於EL),你也可以讓他們遠離你的視野。使用CDI也給你的擴展點大於JSF提供的擴展點,但這不是問題的一部分:)我建議堅持使用CDI。 – LightGuard