好的,所以我有一个JSF支持bean需要引用另一个(@NoneScoped)bean。
我应该@Inject它还是使用@ManagedProperty从容器中获取实例引用?
为什么要使用一个而不是另一个,在我看来,这两种方法可以达到同样的效果。
答案 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通常可用于在必要时提供胶水代码。