获取对其他托管bean的引用的惯用方法是什么?

时间:2011-06-28 11:40:48

标签: jsf jsf-2 cdi

我看到它的方式,有三种方法可以获得对另一个bean的引用:

  1. 使用CDI,我可以@Inject一个命名的bean。这样做的缺点是CDI注释与面部注释不能很好地融合,因此我再也不能使用@ViewScoped
  2. 使用@ManagedProperty似乎是理想的,除了我必须引入一个公共设置器才能工作,这会伤害封装。
  3. 我可以使用这样的东西(在this answer中提出):

    @SuppressWarnings("unchecked")
    public static <T> T findBean(String beanName) {
        FacesContext context = FacesContext.getCurrentInstance();
        return (T) context.getApplication().evaluateExpressionGet(
            context, "#{" + beanName + "}", Object.class);
    }
    

    我可以使用此方法初始化@PostConstruct中的属性。这没有上述缺点,但似乎有点复杂。为什么我必须为框架应该提供的东西编写一个辅助方法?

  4. 我的问题是,我应该使用上述三个中的哪一个?此外,请随时纠正我在上述说明中所述的任何误解,或提出其他(更优雅)方法来实现该目标。

2 个答案:

答案 0 :(得分:3)

如果没有@ViewScoed你真的不能上帝,而你想只留下JSF和CDI - 那么第二个。不要担心外部依赖的封装。即使在面部上下文之外,您仍然必须以某种方式设置另一个对象,因此设置器应该到期。

如果你想为图片添加接缝,而你正在使用CDI,那么第一个。请参阅jan groth的回答。

答案 1 :(得分:2)

绝对是第1名,连同Seam 3 Faces(here)。只需将它放在你的类路径中,@ Viewscoped就可以完美地在CDI和JSF之间架起桥梁:-)不用说CDI具有比JSF附带的依赖注入更优越的概念......