2012-08-31 24 views
11

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

我应该@Inject或使用@ManagedProperty获得来自容器实例引用?

为什么要使用一个,而不是其他,在我心中这两种方法实现同样的事情。

回答

10

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

如果您只是在处理不使用任何其他JavaEE 6功能的servlet应用程序,则请参阅@ManagedProperty。那注释也有反对@Inject一个优势:你可以用它(although there are workarounds to get that in CDI)使用EL(表达式语言)。

这两个注释/容器似乎都实现了“同样的事情”,但以非常不同的方式,它们使用不同的容器。由CDI管理的豆类将可供JSF使用,但不能反之亦然。如果您正在使用JSF的特殊注解注释的豆然后忘了使用自定义的预选赛,拦截器,制作方法等,我通常喜欢的方式与CDI,因为在最后,这是更复杂的,但选择将取决于您的实际需要。

结束工作,因为它似乎你只是使用JSF的功能,然后固守@ManagedProperty(CDI无法理解@NoneScoped注解,在CDI如果没有指定所有的豆类都是下@Default范围)。在您的项目中切换到CDI可能意味着替换的@Inject一个,但是所有的@RequestScoped(以此类推)为CDI特定的。

6

我赞成在CDI管理的bean只要有可能。 CDI在部署时依赖性检查更丰富,其代理支持可防止范围泄漏。这样可以更容易地验证模型的正确性。通常可以使用Producers来在必要时提供胶水代码。

+2

我想补充一点,类似于下面的,你有东西像EJB时,您可以使用CDI注入。如果你不给他们一个@Name(这只是让他们可用于EL),你也可以让他们远离你的视野。使用CDI也给你的扩展点大于JSF提供的扩展点,但这不是问题的一部分:)我建议坚持使用CDI。 – LightGuard