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



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

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

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

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

我的问题是,我应该使用以上三种中的哪一种?此外,请随时纠正我在上述描述中可能提出的任何误解,或提出其他(更优雅的)方法来实现这一目标。

如果你真的不能离开@ViewScoed,并且你只想使用JSF和CDI,那么第二个。不要担心外部依赖项的封装。即使在faces上下文之外,您仍然必须以某种方式设置另一个对象,因此应该使用setter。

如果你想在图片中添加接缝,并且你无论如何都在使用CDI,那么第一个。看看詹格罗斯的回答。

绝对是第一个,以及Seam 3 Faces(此处)。只要把它放在类路径中,@Viewscoped就完美地连接在CDI和JSF之间:-)不用说,CDI在依赖注入方面的概念远远优于JSF。。。

相关内容

  • 没有找到相关文章

最新更新