注入 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