注入vs ManagedProperty

mar*_*bjo 12 jsf cdi managed-bean

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

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

为什么要使用一个而不是另一个,在我看来,这两种方法实现了同样的目的.

Alo*_*uez 9

@ManagedProperty并且@NoneScoped来自JSF 2.0规范,同时@Inject来自CDI规范.

如果您只是在处理一个不使用任何其他JavaEE 6功能的servlet应用程序,那么请继续@ManagedProperty.该注释还具有以下优势@Inject:您可以使用EL(表达式语言)(虽然有一些解决方法可以在CDI中获得).

注释/容器似乎都实现了" 相同的东西 ",但是以不同的方式实现,并且它们使用不同的容器.由CDI管理的Bean将可供JSF使用,但不能反过来.如果您使用JSF特定注释注释您的bean,那么忘记使用自定义限定符,拦截器,生成器方法等.我通常更喜欢使用CDI的方法,因为最后它更复杂但是选择将取决于您的实际需求.

把它包装起来,因为看起来你只是使用JSF功能然后坚持@ManagedProperty(CDI无法理解@NoneScoped注释,在CDI中,@Default如果没有指定,所有bean都在范围内).切换到CDI在您的项目可能意味着更换不只是@ManagedProperty@Inject一个,但所有的@RequestScoped(等)的特定CDI-的.


McD*_*ell 6

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

  • 我会添加这个,类似于下面的内容,你有像你可以用CDI注入的EJB这样的东西.如果你没有给它们@Name(它只是让它们可用于EL),你也可以将它们排除在你的视野之外.使用CDI也会给你扩展点大于JSF中可用的扩展点,但这不是问题的一部分:)我建议坚持使用CDI. (2认同)