好的,所以我有一个需要引用另一个 (@NoneScoped) bean 的 JSF 支持 bean。
我应该@Inject 还是使用@ManagedProperty 从容器中获取实例引用?
为什么使用一种而不是另一种,在我看来,这两种方法可以达到同样的目的。
好的,所以我有一个需要引用另一个 (@NoneScoped) bean 的 JSF 支持 bean。
我应该@Inject 还是使用@ManagedProperty 从容器中获取实例引用?
为什么使用一种而不是另一种,在我看来,这两种方法可以达到同样的目的。
@ManagedProperty
@NoneScoped
来自 JSF 2.0 规范,而来自@Inject
CDI 规范。
如果您只是在开发一个不使用任何其他 JavaEE 6 特性的 servlet 应用程序,那么请选择@ManagedProperty
. 该注释也有一个优势@Inject
:您可以将 EL(表达式语言)与它一起使用(尽管在 CDI 中有解决方法)。
两个注释/容器似乎都实现了“同一件事”,但方式却截然不同,并且它们与不同的容器一起工作。由 CDI 管理的 Bean 将可用于 JSF,但反之则不行。如果您使用 JSF 特定的注释来注释您的 bean,那么请忘记使用自定义限定符、拦截器、生产者方法等。我通常更喜欢使用 CDI 的方法,因为最后它更复杂,但选择取决于您的实际需求.
总结一下,因为您似乎只是在使用 JSF 功能然后坚持使用@ManagedProperty
(CDI 无法理解注释,在 CDI 中,如果没有指定@NoneScoped
,所有 bean 都在范围内)。@Default
在您的项目中切换到 CDI 可能意味着不仅要替换@ManagedProperty
一个@Inject
,而且要替换所有@RequestScoped
CDI 特定的(等等)。
只要有可能,我会更喜欢 CDI 而不是托管 bean。CDI 在部署时依赖检查方面更丰富,其代理支持可防止范围泄漏。这样可以更轻松地验证模型的正确性。生产者通常可用于在必要时提供胶水代码。