注入 vs ManagedProperty [重复]

Posted

技术标签:

【中文标题】注入 vs ManagedProperty [重复]【英文标题】:Inject vs ManagedProperty [duplicate] 【发布时间】:2012-08-26 07:25:01 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

CDI spec Blog post on CDI and EL

【讨论】:

我会添加这个,类似于下面的内容,您可以使用 CDI 注入 EJB 之类的东西。如果您不给它们一个@Name(这只是使它们对 EL 可用),您也可以将它们排除在您的视野之外。使用 CDI 还可以为您提供比 JSF 中可用的更多的扩展点,但这不是问题的一部分 :) 我建议坚持使用 CDI。【参考方案2】:

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

如果您只是在开发一个不使用任何其他 JavaEE 6 功能的 servlet 应用程序,那么请选择@ManagedProperty。相对于@Inject,该注释还有一个优势:您可以使用 EL(表达式语言)与它 (although there are workarounds to get that in CDI)。

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

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

【讨论】:

以上是关于注入 vs ManagedProperty [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法将 JSF ViewScoped bean 作为 ManagedProperty 注入 Validator

JSF 2 使用 @ManagedProperty 注入 Spring bean/service 而没有 xml

ViewParam 与 @ManagedProperty(value = "#param.id")

@ManagedProperty(value = "#param.id") 在非请求范围 Bean

在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException

ViewScoped Bean 中 SessionScope 的 ManagedProperty - 瞬态?