注入vs ManagedProperty

时间:2012-08-31 13:06:13

标签: jsf cdi managed-bean

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

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

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

2 个答案:

答案 0 :(得分:10)

@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如果没有指定,则在@Default范围内。在项目中切换到CDI可能意味着不仅要替换@ManagedProperty的{​​{1}},还要替换CDI特定的@Inject(等等)。

答案 1 :(得分:6)

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