12

好的,所以我有一个需要引用另一个 (@NoneScoped) bean 的 JSF 支持 bean。

我应该@Inject 还是使用@ManagedProperty 从容器中获取实例引用?

为什么使用一种而不是另一种,在我看来,这两种方法可以达到同样的目的。

4

2 回答 2

9

@ManagedProperty@NoneScoped来自 JSF 2.0 规范,而来自@InjectCDI 规范。

如果您只是在开发一个不使用任何其他 JavaEE 6 特性的 servlet 应用程序,那么请选择@ManagedProperty. 该注释也有一个优势@Inject:您可以将 EL(表达式语言)与它一起使用(尽管在 CDI 中有解决方法)。

两个注释/容器似乎都实现了“同一件事”,但方式却截然不同,并且它们与不同的容器一起工作。由 CDI 管理的 Bean 将可用于 JSF,但反之则不行。如果您使用 JSF 特定的注释来注释您的 bean,那么请忘记使用自定义限定符、拦截器、生产者方法等。我通常更喜欢使用 CDI 的方法,因为最后它更复杂,但选择取决于您的实际需求.

总结一下,因为您似乎只是在使用 JSF 功能然后坚持使用@ManagedProperty(CDI 无法理解注释,在 CDI 中,如果没有指定@NoneScoped,所有 bean 都在范围内)。@Default在您的项目中切换到 CDI 可能意味着不仅要替换@ManagedProperty一个@Inject,而且要替换所有@RequestScopedCDI 特定的(等等)。

于 2012-08-31T13:20:21.883 回答
6

只要有可能,我会更喜欢 CDI 而不是托管 bean。CDI 在部署时依赖检查方面更丰富,其代理支持可防止范围泄漏。这样可以更轻松地验证模型的正确性。生产者通常可用于在必要时提供胶水代码。

于 2012-08-31T13:58:24.890 回答